0

函数什么时候入栈?

就像,当它们被编译时,每个函数都放在堆栈上,然后当一个对象调用它时,它会转到堆栈上的那个函数?

或者

首先将主函数加载到堆栈上,然后在堆中分配对象,然后当对象调用函数时,它们被放入堆栈中,每次都将内存分配给堆栈上的本地变量?

并且做静态方法也遵循相同的程序,就像普通函数一样,因为我听说它们只分配了一次内存。

所以请帮助我确定程序的哪个图形表示是正确的......

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

3

函数入栈。调用栈包含调用帧,当一个函数被调用时,一个新的调用帧被推送。函数返回时弹出。

调用帧通常还包含一些指向 [调用] 函数代码(即返回地址)的引用或指针,通常表示为java 字节码

这是一种非常常见的情况,但不是普遍的情况。请参阅旧 A.Appel 的Compiling with Continuations书(描述没有任何堆栈的 SML/NJ 实现)。

于 2013-10-02T07:07:50.663 回答
1

函数什么时候入栈?

堆栈包含数据,而不是函数。为函数预先分配空间是没有意义的,因为它可以递归调用,或者根本不调用。

当它们被编译时,每个函数都被放入堆栈,

你在哪里读到的?

然后当一个对象调用它时,

线程运行代码,而不是对象。

它进入堆栈上的那个函数?

没有什么喜欢的。

首先将 main 函数加载到堆栈上,

函数不会加载到堆栈中。

然后在堆中分配对象,

可能,尽管它们可以通过逃逸分析在堆栈上分配。

然后当对象调用函数时,它们被放入堆栈,

线程调用方法,当一个方法被调用时,它可以选择分配一个堆栈帧。该堆栈帧可以包含局部变量和堆栈分配的对象。

每次将内存分配给堆栈上的本地变量?

每个方法调用都可以为所有使用内存的局部变量分配一块内存。注意:一些局部变量可以分配给寄存器并且可能不使用堆栈。

并且做静态方法也遵循相同的程序,

静态方法和非静态方法之间没有真正的区别,除了非静态方法在实例开始时会有一个额外的参数。

像普通函数一样,因为我听说它们只分配了一次内存。

方法每次调用只分配一次。假设您有一个内部带有局部变量的循环,它仍然只会分配一次。

于 2013-10-02T08:12:09.860 回答
0

堆栈是在运行时构建的。如果调用了一个方法(无论是否为静态),它的调用将被放入堆栈。如果方法完成,它将从堆栈中删除,以便调用者再次成为第一个元素并继续执行。

您可以使用调试器来观察这一点。调试器向您显示调用堆栈。如果您在 main 方法中设置断点并进入另一个方法调用,您将看到该方法调用是 main 方法上方堆栈中的顶部元素。

于 2013-10-02T07:11:03.243 回答