【问题标题】:memory allocation - Java vs C++内存分配 - Java vs C++
【发布时间】:2015-06-06 05:39:11
【问题描述】:

在 java 和 C++ 中给定类 Line,以及以下分别在 java 和 C++ 中的声明 -

Line[] p; 

Line *p;

然后运行以下代码时,两种语言的语义有什么区别:

p = new Line[7];

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

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

谢谢!

【问题讨论】:

    标签: java c++ memory heap-memory


    【解决方案1】:

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

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

    您发布的 C++ 版本:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这在分配多维数组时变得很重要。虽然 C++ 将所有维度分配为一大块内存,但 Java 分散子数组。例如,对于ints 的 10x10 数组,Java 分配了 10 个大小为 10 * size of int + a little 的数组加上一个大小为 10 * size of reference + a little 的数组,C++ 只分配了一个大小为 100 * size of int 的数组。 Java 中需要a little 以获取更多信息:数组大小、类型、...
      • 是的,很好的观点和完全正确的 Turing85! :O) 为 OP 附加 C++ (fredosaurus.com/notes-cpp/arrayptr/…) 和 Java (javamex.com/tutorials/memory/array_memory_usage.shtml) 的二维内存分配参考
      • @user3636636 上面的代码将创建一个包含七个引用的数组。这些引用将设置为null。您可以通过遍历数组并打印new Line[7]; 之后的条目来验证这一点。两个数组(在 C++ 和 Java 中)都使用 null 初始化,因为 C++ 和 Java 都不“知道”如何初始化一行。内置插件(intlong,...)的情况有所不同,因为它们具有适当的默认值。此外,C++ 使用“就地”数组:数组直接存储条目,而 java 数组“仅”存储对对象的引用。
      • @Turing85:对于一个对象数组,C++ 将需要一个默认构造函数,因此它确实知道如何初始化'Line' - C++ 将根据默认构造函数。
      • 这个答案有点问题。虽然说明两个 sn-ps 之间的语义差异很大(这是整个问题的本质),但在没有上下文的情况下提及引用/指针数组(相对于值数组)的开销是非常误导.我已经看到那些盲目地试图消除这种“间接成本”的人,因为他们在其他地方听说过它,所以我看到了可笑的错误低效的 C 和 C++ 代码(完全浪费了数百兆字节的内存)没有上下文。
      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-04-16
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多