Java与C ++内存分配

时间:2015-03-03 13:21:54

标签: java c++

c ++中的示例

Employee emp=new Employee();

现在创建 x 字节来存储Employee。并且 y 字节是存储引用所必需的。因此需要 x + y 字节。

现在在c ++中,因为没有垃圾收集,它的程序员有责任销毁对象。

员工emp2 = emp;

问题1:现在是否为emp2创建了一个(x + y)的地址空间?

在Java中

它只指向堆中的对象。

问题2:这是否意味着如果将相同的对象添加到java中的ArrayList中,可以说100次,那么所使用的内存只是存储堆中对象的引用? 即只使用100 * y + x的内存量?

2 个答案:

答案 0 :(得分:2)

这是否意味着如果将相同的对象添加到java中的ArrayList中,可以说100次,那么使用的内存只是存储堆中对象的引用?即只使用100 * y + x的内存量? - 是的。在 collections 中,只添加对实际对象(几乎总是在堆上)的引用。

作为旁注,java具有 4字节引用,与架构无关(32位/ 64位)。

答案 1 :(得分:1)

函数调用的堆栈内存'局部变量;函数调用的堆栈是嵌套的。

这是变量的内存。在Java中对对象的引用。对象本身存储在上,垃圾回收。数组也是Java中的Object。 Java在堆栈上没有C结构。 这是一个历史性的设计决策,保持一切简单,作为“复杂”C ++的继承者。

现在在C ++中,堆栈上有一个直接的结构或数组(没有new / malloc)。然后,您需要一个复制构造函数,用于将数据从一个空间铲除到另一个空间(堆栈或堆)。

有效的区别在于,在C中,可以有一个链表,每个节点都是胖的,里面有数据。 在Java中,假设LinkedList<T>每个节点(一个堆对象)将包含一个额外的间接,即对T数据对象的引用。 数据可以用Java共享,也可以用C语言复制。

从这个角度来看,您可以自己计算内存使用量。我觉得有必要提一下,Java的好垃圾收集总体上比malloc / free of C更好。所以Java肯定不是那么糟糕。