内存分配 - Java vs C++

memory allocation - Java vs C++

在 java 和 C++ 中给定 class 行,在 java 和 C++ 中分别有以下声明 -

Line[] p; 

Line *p;

当运行以下代码时,两种语言在语义上有什么区别:

p = new Line[7];

特别是,两种语言是否以相同的方式为数组分配堆内存?

对不起,我研究过这个问题,但我仍然觉得我没有完全理解。

谢谢!

在 Java 中声明数组时,它们存储为引用数组。在 C++ 中初始化 Line class 的数组时,您不会 运行 承担此开销成本,因为您的数组将保存对象,而不仅仅是它们的引用。

您正在比较 Java 和不等效的 C++ 代码。 以下 C++ 等效于您的 Java 代码(引用数组):

Line **p;
p = new Line*[7];

您发布的C++版本:

Line *p;
p = new Line[7];

是一个对象数组,并使用 'Line' 的默认构造函数初始化数组的每个元素(尝试使用显式 1 参数构造函数,您会看到 C++ 告诉您需要一个默认构造函数)。 Java 没有与这种创建非原始类型数组的方式相同的方法,这些非原始类型的数组让每个元素默认构造 - 在 Java 中,非原始类型数组的所有元素都是 'null' 直到你显式分配它们)。

如上所述,等效的 C++ 代码实际上是

Line **p;
p = new Line*[7];

因为Java分配的是引用数组,而不是临时对象数组。

在 C++ 中,new 运算符保证从堆中分配内存。 在 Java - 这取决于。通常 new 关键字从堆中分配内存,但是一些编译器,例如 HotSpot 预制所谓的 "escape analysis" :如果编译器检测到指针不是从函数返回的,也不会转到不同的线程- 它可以声明堆栈中的对象(相当于Line p[7] C++)