在连续函数调用的情况下,C 编译器是否优化执行堆栈?

Do C compilers optimize the execution stack in case of successive function calls?

我有一个关于调用堆栈行为的基本问题。 我想知道当一个函数在另一个函数的末尾调用时,系统如何管理调用堆栈内存。

例如:

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() 时,堆栈内存是否保持整个执行级别?

或许我从一开始就对调用堆栈的工作原理及其用途一无所知?

感谢您的帮助。

实际上,在对参数和局部变量进行一些特定调整后,可以将 functionOne()functionTwo() 的调用和 functionTwo()functionThree() 的调用生成为跳转调用者的(你可以堆栈清理)。这称为 尾调用优化 。它们也可以内联生成,被调用函数的代码成为调用函数的一部分。

C 编译器是否执行尾调用优化、内联生成或一些更高级的技巧是实现质量问题。这样做可能会提高代码速度并减少堆栈使用,但会使调试更加困难,因为调用堆栈可能难以跟踪。

标准对此没有强加任何要求,编译器必须生成代码就好像调用正常发生一样。

照片应该是这样的: memory stack