什么时候把功能放在堆栈上?
比如,当它们被编译时,每个函数都被放在堆栈上,然后当一个对象调用它时,它会转到堆栈上的那个函数吗?
OR
首先将main函数加载到堆栈中,然后在堆中分配对象, 然后当对象调用函数时,它们被放入堆栈,每次都将内存分配给堆栈上的本地变量?
并且静态方法也遵循相同的过程,就像正常的函数一样,因为我听说它们只被分配了一次内存。
所以请帮我确定一下这个节目的图形表示是否正确......
答案 0 :(得分:3)
函数不放在堆栈上。 call stack包含调用帧,并且在调用函数时,会推送新的调用帧。它在函数返回时弹出。
调用帧通常还包含一些引用或指向[调用]函数代码的指针(即返回地址),通常表示为java bytecode
这是一种非常常见的情况,但不是普遍情况。请参阅旧A.Appel的 Compiling with Continuations 一书(描述没有任何堆栈的SML / NJ实现)。
答案 1 :(得分:1)
什么时候把功能放在堆栈上?
堆栈包含数据,而不是函数。为函数预先分配空间是没有意义的,因为它可以递归调用,或者根本不调用。
编译时,每个函数都放在堆栈中,
你在哪里读到这个?
然后当一个对象调用它时,
线程运行代码,而不是对象。
它会转到堆栈上的那个函数吗?
没有比它更好的了。
首先将main函数加载到堆栈中,
函数未加载到堆栈中。
然后在堆中分配对象,
可能,虽然它们可以通过转义分析在堆栈上分配。
然后当对象调用函数时,它们被放到堆栈中,
线程调用方法,当调用方法时,它可以选择分配堆栈帧。该堆栈帧可以包含局部变量和堆栈分配的对象。
每次将内存分配给堆栈上的本地变量?
每个方法调用都可以为使用内存的所有局部变量分配单个内存块。注意:一些局部变量可以分配给寄存器,也可以不使用堆栈。
并且静态方法也遵循相同的步骤,
静态和非静态方法之间没有真正的区别,除非非静态方法在实例的开头有一个额外的参数。
和普通函数一样,因为我听说它们只被分配了一次内存。
方法每次调用只分配一次。假设你有一个包含局部变量的循环,它仍然只会被分配一次。
答案 2 :(得分:0)
堆栈是在运行时构建的。如果一个方法(无论是否静态)被调用,它的调用就被放在堆栈上。如果方法完成,它将从堆栈中删除,以便调用者再次成为第一个元素并继续执行。
您可以使用调试器来观察此情况。调试器显示调用堆栈。如果在main方法中设置断点并进入另一个方法调用,您将看到该方法调用是main方法上方堆栈中的顶部元素。