Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存分配——java vs C++ java和C++中的类行,以及爪哇和C++中的以下声明-< /P> Line[] p;_Java_C++_Memory_Heap - Fatal编程技术网

内存分配——java vs C++ java和C++中的类行,以及爪哇和C++中的以下声明-< /P> Line[] p;

内存分配——java vs C++ java和C++中的类行,以及爪哇和C++中的以下声明-< /P> Line[] p;,java,c++,memory,heap,Java,C++,Memory,Heap,及 运行以下代码时,这两种语言在语义上有什么区别: p = new Line[7]; 特别是,这两种语言是否以相同的方式为数组分配堆内存 对不起,我做了这方面的研究,但我仍然觉得我还没有完全理解 谢谢 在Java中声明数组时,它们存储为引用数组。在初始化C++类中的行类数组时,不会遇到开销,因为数组将包含对象,而不仅仅是它们的引用。 ,您比较java和C++代码,它们不等价。 下面的C++与你的java代码数组的引用等价: Line **p; p = new Line*[7]; 你发布的C+

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

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

对不起,我做了这方面的研究,但我仍然觉得我还没有完全理解


谢谢

在Java中声明数组时,它们存储为引用数组。在初始化C++类中的行类数组时,不会遇到开销,因为数组将包含对象,而不仅仅是它们的引用。

,您比较java和C++代码,它们不等价。 下面的C++与你的java代码数组的引用等价:

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

你发布的C++版本:

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

是一个对象数组,使用“行”的默认构造函数初始化数组的每个元素,用显式的1参数构造函数来尝试它,您会看到C++告诉您需要默认构造函数。java没有等效的方式来创建非原语数组,它可以让每个元素默认构造——在java中,非原始数组的所有元素都是“null”,直到C++显式赋值它们。

Line **p;
p = new Line*[7];
因为Java分配的是引用数组,而不是临时对象数组

<>在C++中,新操作符被保护以从堆分配内存。
在Java中-这取决于。通常,new关键字从堆中分配内存,但有些编译器,如HotSpot preform,即所谓的转义分析:如果编译器检测到指针不是从函数返回的,也不是到不同的线程,它可能会将堆栈中的对象声明为与第p[7]行等效的对象当C++分配多维数组时,这一点变得很重要。当C++将所有维度分配为一个大的内存块时,java分散了子数组。对于一个10x10的INT数组,java,java分配10个大小为10×10的数组,加上一个数组大小为10×*的参考大小,C++只分配一个大小为100×int的数组。Java中需要一个额外的信息:数组的大小,类型,…,是的,大点,恰到好处的Turn85!o为C++和java附加二维内存分配REFOP@user3636636上面的代码将创建一个包含七个引用的数组。这些引用将设置为null。您可以通过迭代数组并在新行[7];之后打印条目来验证这一点;。C++和java中的两个数组都是空的初始化,因为C++和java都不知道如何初始化一行。这种情况与内置int、long等不同。。。因为它们具有propper默认值。Furhtermore,C++使用就地数组:数组存储条目dirCurt,而java数组只存储对象引用。@ Turn85:对于一个对象数组,C++将需要一个默认构造函数,所以它知道如何初始化一个“行”-C++将根据默认构造函数初始化它。这个答案有点问题。虽然说明这两个代码片段在语义上的差异非常大,这是整个问题的本质所在,但提到引用/指针数组与值数组的开销在没有上下文的情况下是非常容易误导的。我已经看到了错误的和低效的C和C++代码,它们的内存是几百亿字节的,完全被那些盲目地试图消除开销开销的人浪费掉,因为他们在别的地方没有上下文就听说过。
Line **p;
p = new Line*[7];