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

时间:2018-10-12 08:15:03

标签: c embedded compiler-optimization callstack

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

例如:

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

或者从一开始就关于调用堆栈的工作方式及其目的,我是错的?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

实际上,在经过一些特定的调整以解决参数的参数和局部变量之后,可能会产生从functionTwo()functionOne()和从functionThree()functionTwo()的调用。调用方(您可以堆栈清理)。这称为尾部呼叫优化。它们也可以内联生成,被调用函数的代码成为调用函数的一部分。

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

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

答案 1 :(得分:-2)

应该像这张照片: memory stack