内存分配 - Java与C ++

时间:2015-06-06 05:39:11

标签: java c++ memory heap

给出java和C ++中的类Line,以及java和C ++中的以下声明 -

Line[] p; 

Line *p;

运行以下代码时,两种语言之间的语义有何不同:

p = new Line[7];

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

抱歉,我对此事进行了研究,但我仍然觉得我还没有完全理解。

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

您发布的C ++版本:

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

是一个对象数组,使用默认的'Line'构造函数初始化数组的每个元素(尝试使用显式的1参数构造函数,你会发现C ++告诉你需要一个默认的构造函数)。 Java没有相当于这种创建非基本类型数组的方法,它们使每个元素都默认构造 - 在Java中,非基本类型数组的所有元素都是'null',直到你明确地赋值它们。)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

因为Java分配了一个引用数组,而不是ad-hoc对象数组。

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