为什么C++堆分配与 Java 的堆分配相比如此慢?
Why is C++ heap allocation so slow compared to Java's heap allocation?
我在Java和c++中运行了一些小测试,创建了大量非常小的对象(没有类成员,没有构造函数),Java显然更快(我的意思是c++似乎真的很慢)。我敢打赌这与JVM有关,但是以哪种方式呢?
编辑:我在c++中使用的类是这样的(正如我所说的没有类成员,在构造函数中不做任何事情):class foo{
public:
foo(){}
~foo(){}
}
在Java中:
public class Foo{
public Foo(){}
}
我做的小测试只是关于在一个循环中分配大量对象(一行大约1000000000个)。我使用GCC 4.7.2和Java 1.7通过OpenJDK实现,两者都在使用Linux的同一台机器上。
我打赌它确实与内存池分配有关,这表明JVM拥有不需要的内存。
我仍然感到困惑,因为我认为JVM实际上会更慢,计数指针引用和分配内存。
在堆上分配许多小对象是Java运行时通常比c++(在大多数主流实现中)更好地优化开箱即用的一种情况。每次在c++中使用new
分配堆对象时,实现通常会对操作系统进行系统调用(至少在Linux和Windows等大多数主流平台上是这样)。在Java中,它通常从JVM提供的内存池中进行分配,该内存池是专门为在堆上分配Java对象而设计和优化的。
一般来说,c++为程序如何分配和管理内存提供了更细粒度的控制。而jvm受到实际Java语言规范的限制,需要堆分配对象和垃圾收集。但是,如果您正在用c++编写需要在堆上分配许多小对象的应用程序,则可能需要考虑使用内存池分配器。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源