C/Java中的堆栈与堆比较

4

以下是我的理解。

在C编程中,如果我使用int a,那么a将被创建在堆栈上,因此内存将从堆栈中取出。堆不在这里起作用。

但如果我执行类似以下代码:

int *a;
a=(int*)malloc(sizeof(int));

如果动态分配内存,那么引用变量将被放置在栈上,但它所指向的内存将在堆上。
我理解得对吗?
现在,我拿起了一本关于 Java 的书,上面说:
“每当需要一个对象时,你只需编写使用 new 创建该对象的代码,并在执行该代码时分配存储空间。”
因此,在 Java 中无法在栈上创建对象?
我猜,原始数据类型仍然可以放置在栈上,但我关心的是对象。

现代JVM可以跳过一些短暂存在的对象的堆使用,并在即时编译步骤发生时将它们抛到堆栈上。然而,您无法控制这一点。 - Affe
1
你说的有一个错误:在C语言中,对于你提到的第一种情况(int a),只有当a是函数的局部变量(并且没有声明为静态变量)时,它才会存储在堆栈中。如果它被声明为全局或静态变量,则存储在数据段中,该段被细分为只读数据(如字符串常量)和未初始化数据(BSS)。对于分配的内存区域的引用,在第二种情况下也是同样的情况。 - ionela.voinescu
3个回答

7

Java中不能在堆栈上创建对象。Java还具有自动垃圾回收功能,因此您没有任何删除对象的方法。您只需让所有引用超出范围,最终垃圾收集器就会处理它们。


5

没错,对象被存储在堆中。栈包含原始类型的值,比如 intdouble(来自局部变量),以及对对象的引用(同样来自局部变量)。


0

你问题的整个前提是错误的:在Java中,你无法控制对象将被分配到哪里。有些确实是堆栈分配的,但你永远不会注意到差异。

Java和C之间的根本区别在于,在Java中,变量的值永远不能是对象本身,而在C中,值可以是结构体本身,没有间接引用。你可以将这样的结构体按值传递给其他函数,在Java中没有相应的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接