在连续函数调用的情况下,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
我有一个关于调用堆栈行为的基本问题。 我想知道当一个函数在另一个函数的末尾调用时,系统如何管理调用堆栈内存。
例如:
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