内存分配- Java vs c++

memory allocation - Java vs C++

本文关键字:vs c++ Java 分配 内存      更新时间:2023-10-16

给定java和c++中的类Line,以及java和c++中的以下声明-

Line[] p; 

Line *p;

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

p = new Line[7];
特别是,这两种语言是否以相同的方式为数组分配堆内存?

对不起,我对这件事做了研究,但我仍然觉得我没有完全了解。

谢谢!

你在比较不相等的Java和c++代码。下面的c++代码相当于Java代码(引用数组):

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

你发布的c++版本:

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

是一个对象数组,并使用'Line'的默认构造函数初始化数组的每个元素(尝试使用一个显式的1参数构造函数,您将看到c++告诉您需要默认构造函数)。Java没有类似的方法来创建非基本类型数组,让每个元素都默认构造(在Java中,非基本类型数组的所有元素都是'null',除非你显式地为它们赋值)。

在Java中声明数组时,它们被存储为引用数组。在c++中初始化Line类的数组时,您不会遇到这种开销开销,因为您的数组将保存对象,而不仅仅是它们的引用。

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

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

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

在c++中,new操作符保证从堆中分配内存。在Java中——这要看情况。通常new关键字从堆中分配内存,但一些编译器,如HotSpot执行所谓的"转义分析":如果编译器检测到指针没有从函数返回,也没有去到不同的线程-它可能在堆栈中声明对象(相当于Line p[7] c++)