Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C++堆分配比java堆分配这么慢? 我在爪哇和C++中做了小测试,创建了很多小的对象,没有类成员,在构造函数和java中没有什么明显的快,我的意思是C++看起来很慢。我打赌这与JVM有关,但以哪种方式_Java_C++_Performance_Heap_Allocation - Fatal编程技术网

为什么C++堆分配比java堆分配这么慢? 我在爪哇和C++中做了小测试,创建了很多小的对象,没有类成员,在构造函数和java中没有什么明显的快,我的意思是C++看起来很慢。我打赌这与JVM有关,但以哪种方式

为什么C++堆分配比java堆分配这么慢? 我在爪哇和C++中做了小测试,创建了很多小的对象,没有类成员,在构造函数和java中没有什么明显的快,我的意思是C++看起来很慢。我打赌这与JVM有关,但以哪种方式,java,c++,performance,heap,allocation,Java,C++,Performance,Heap,Allocation,编辑: 我使用的类是这样的,因为我没有类成员,C++中的构造函数没有做任何事情: class foo{ public: foo(){} ~foo(){} } 在Java中: public class Foo{ public Foo(){} } 我做的小测试只是在一个循环中分配成吨的对象,一行大约100000000个。我通过OpenJDK实现使用了GCC4.7.2和Java1.7,这两个版本都在使用Linux的同一台机器上 我打赌这确实与内存池分

编辑:

我使用的类是这样的,因为我没有类成员,C++中的构造函数没有做任何事情:

class foo{
    public:
        foo(){}
        ~foo(){}
}
在Java中:

public class Foo{
    public Foo(){}
}
我做的小测试只是在一个循环中分配成吨的对象,一行大约100000000个。我通过OpenJDK实现使用了GCC4.7.2和Java1.7,这两个版本都在使用Linux的同一台机器上

我打赌这确实与内存池分配有关,这表明JVM拥有未使用的内存


我仍然困惑,因为我认为JVM实际上会更慢,计数指针引用和分配内存。

堆上许多小对象的分配是一个情况,java的运行时通常比C++在大多数主流实现中更好地优化。每次使用新的C++来分配堆对象时,通常会在Linux和Windows等主流平台上对OS进行系统调用。在Java中,它通常从JVM提供的内存池进行分配,JVM是专门为在堆上分配Java对象而设计和优化的

如果使用特殊的内存池分配器,C++在大多数情况下可能会更快。另外,C++提供了在堆栈上分配对象的选项,当然,这比任何一个都快。p>
一般来说,C++提供了对程序如何分配和管理内存的细粒度控制。而JVM则受到实际Java语言规范的约束,该规范支持数据收集和垃圾收集。但是如果你在C++中编写一个应用程序,需要在堆上分配许多小对象,你可能需要考虑使用内存池分配器。

堆上许多小对象的分配是一个情况,java的运行时通常比C++在大多数主流实现中更好地优化。每次使用新的C++来分配堆对象时,通常会在Linux和Windows等主流平台上对OS进行系统调用。在Java中,它通常从JVM提供的内存池进行分配,JVM是专门为在堆上分配Java对象而设计和优化的

如果使用特殊的内存池分配器,C++在大多数情况下可能会更快。另外,C++提供了在堆栈上分配对象的选项,当然,这比任何一个都快。p>
一般来说,C++提供了对程序如何分配和管理内存的细粒度控制。而JVM则受到实际Java语言规范的约束,该规范支持数据收集和垃圾收集。但是如果你正在编写C++中的一个应用程序,需要在堆上分配许多小对象,你可能需要考虑使用内存池分配器。这取决于C++编译器、JVM版本、基准程序、平台、……热点,我假设您使用的是优化运行时。对象内存分配现在非常快,几乎被认为是空闲的。但是,我没有看到你的C++代码或你使用的编译器实现,所以我无法评论它是多么的优化。你不在这里把苹果和苹果进行比较。JVM在这种情况下使用预先分配的内存池。C++没有这种构建的预构建功能,而是为每个分配查询OS内存管理器。这是不寻常的人写一个系统,提供了JVM在这里做了一个内存池分配器在C++。此外,这是一个合法的问题,所有的反对票都是B。虽然它可以从更多关于测试的具体实现和测试的细节中获益,但这是一个基本合理的问题——特别是,尽管有一些变化,这两种语言的实现是一致的,只需稍加警告就可以回答问题。@戴夫,我不认为典型的C++实现会问OS的每一个分配。Maloc和New有很多约束,使得许多优化不可行,但至少C或C++运行库可以分配OS的较大内存块,并将其分配给大多数分配。这个问题是不可能回答的。这取决于C++编译器、JVM版本、基准程序、平台、……热点,我假设您使用的是优化运行时。对象内存分配现在非常快,几乎被认为是空闲的。但是,我没有看到你的C++代码或你使用的编译器实现,所以我无法评论它是多么的优化。你不在这里把苹果和苹果进行比较。JVM在这种情况下使用预先分配的内存池。C
++没有这种构造的预构建功能,而是查询操作系统内存管理器中的每个分配。这是不寻常的人写一个系统,提供了JVM在这里做了一个内存池分配器在C++。此外,这是一个合法的问题,所有的反对票都是B。虽然它可以从更多关于测试的具体实现和测试的细节中获益,但这是一个基本合理的问题——特别是,尽管有一些变化,这两种语言的实现是一致的,只需稍加警告就可以回答问题。@戴夫,我不认为典型的C++实现会问OS的每一个分配。Maloc和New有很多约束,使得许多优化不可行,但至少C或C++运行库可以从OS分配更大的内存块,并将其分配给大多数分配。