内存分配 - 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++)
在 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++)