下面的功能是否需要执行任何堆栈?
int a;
void func(void)
{
a = 10;
}
只要C编译器可以看到func
的定义,它就可以 1 实现func
而无需使用任何堆栈空间。例如,在看到呼叫func
的地方,它可以通过发出一两个指令将10移动到a
来实现。这将达到与将func
称为子例程的结果相同的结果,因此C规则允许C实施以这种方式实现func
的调用,并且不使用任何堆栈空间。
通常,如果编译器看不到func
的定义,就像编译了调用func
但没有定义的源文件时,编译器必须发出呼叫指令或类似的内容,并且会在至少,将返回地址推到堆栈中。
此外,如果被调用的例程更为复杂,则编译器可能会选择不实施内联或可能无法实现它。(例如,如果func
包含对自身的调用,则编译器通常不可能在所有情况下使用内联代码实现;编译器将需要使用实际的子例程呼叫指令来实现它。)/p>
脚注
1 是否有任何特定的编译器在不使用堆栈空间的情况下实现func
是另一回事,取决于编译器,用于编译的开关和其他因素。