我有一个关于调用堆栈行为的基本问题。 我想知道在另一个函数结束时调用一个函数时系统如何管理调用堆栈内存。
例如:
void FunctionOne(void)
{
[...] // Various code operations
FunctionTwo();
}
void FunctionTwo(void)
{
[...] // Various code operation
FunctionThree();
}
void FunctionThree(void)
{
[...] // Various code operation
FunctionFour();
[...] // Various code operation
}
当执行从FunctionOne()跳转到FunctionTwo()时,由于在调用FunctionTwo()之后没有任何指令,是否清除了调用堆栈内存?
当从FunctionTwo()到FunctionThree()时,堆栈存储器是否保持整个执行级别?
或者从一开始就关于调用堆栈的工作方式及其目的,我是错的?
感谢您的帮助。
答案 0 :(得分:4)
实际上,在经过一些特定的调整以解决参数的参数和局部变量之后,可能会产生从functionTwo()
到functionOne()
和从functionThree()
到functionTwo()
的调用。调用方(您可以堆栈清理)。这称为尾部呼叫优化。它们也可以内联生成,被调用函数的代码成为调用函数的一部分。
无论C编译器执行尾部调用优化,内联生成还是一些更高级的技巧,都是实现质量的问题。这样做可以提高代码速度,减少堆栈使用量,但由于调用堆栈可能难以跟踪,因此使调试更加困难。
标准对此没有任何要求,编译器必须生成代码,就像调用正常发生一样。
答案 1 :(得分:-2)
应该像这张照片: memory stack