函数什么时候入栈?
就像,当它们被编译时,每个函数都放在堆栈上,然后当一个对象调用它时,它会转到堆栈上的那个函数?
或者
首先将主函数加载到堆栈上,然后在堆中分配对象,然后当对象调用函数时,它们被放入堆栈中,每次都将内存分配给堆栈上的本地变量?
并且做静态方法也遵循相同的程序,就像普通函数一样,因为我听说它们只分配了一次内存。
所以请帮助我确定程序的哪个图形表示是正确的......
函数什么时候入栈?
就像,当它们被编译时,每个函数都放在堆栈上,然后当一个对象调用它时,它会转到堆栈上的那个函数?
或者
首先将主函数加载到堆栈上,然后在堆中分配对象,然后当对象调用函数时,它们被放入堆栈中,每次都将内存分配给堆栈上的本地变量?
并且做静态方法也遵循相同的程序,就像普通函数一样,因为我听说它们只分配了一次内存。
所以请帮助我确定程序的哪个图形表示是正确的......
函数什么时候入栈?
堆栈包含数据,而不是函数。为函数预先分配空间是没有意义的,因为它可以递归调用,或者根本不调用。
当它们被编译时,每个函数都被放入堆栈,
你在哪里读到的?
然后当一个对象调用它时,
线程运行代码,而不是对象。
它进入堆栈上的那个函数?
没有什么喜欢的。
首先将 main 函数加载到堆栈上,
函数不会加载到堆栈中。
然后在堆中分配对象,
可能,尽管它们可以通过逃逸分析在堆栈上分配。
然后当对象调用函数时,它们被放入堆栈,
线程调用方法,当一个方法被调用时,它可以选择分配一个堆栈帧。该堆栈帧可以包含局部变量和堆栈分配的对象。
每次将内存分配给堆栈上的本地变量?
每个方法调用都可以为所有使用内存的局部变量分配一块内存。注意:一些局部变量可以分配给寄存器并且可能不使用堆栈。
并且做静态方法也遵循相同的程序,
静态方法和非静态方法之间没有真正的区别,除了非静态方法在实例开始时会有一个额外的参数。
像普通函数一样,因为我听说它们只分配了一次内存。
方法每次调用只分配一次。假设您有一个内部带有局部变量的循环,它仍然只会分配一次。
堆栈是在运行时构建的。如果调用了一个方法(无论是否为静态),它的调用将被放入堆栈。如果方法完成,它将从堆栈中删除,以便调用者再次成为第一个元素并继续执行。
您可以使用调试器来观察这一点。调试器向您显示调用堆栈。如果您在 main 方法中设置断点并进入另一个方法调用,您将看到该方法调用是 main 方法上方堆栈中的顶部元素。