C函数是否没有任何参数和返回值需要堆栈才能执行



下面的功能是否需要执行任何堆栈?

int a;
void func(void)
{
    a = 10;
}

只要C编译器可以看到func的定义,它就可以 1 实现func而无需使用任何堆栈空间。例如,在看到呼叫func的地方,它可以通过发出一两个指令将10移动到a来实现。这将达到与将func称为子例程的结果相同的结果,因此C规则允许C实施以这种方式实现func的调用,并且不使用任何堆栈空间。

通常,如果编译器看不到func的定义,就像编译了调用func但没有定义的源文件时,编译器必须发出呼叫指令或类似的内容,并且会在至少,将返回地址推到堆栈中。

此外,如果被调用的例程更为复杂,则编译器可能会选择不实施内联或可能无法实现它。(例如,如果func包含对自身的调用,则编译器通常不可能在所有情况下使用内联代码实现;编译器将需要使用实际的子例程呼叫指令来实现它。)/p>

脚注

1 是否有任何特定的编译器在不使用堆栈空间的情况下实现func是另一回事,取决于编译器,用于编译的开关和其他因素。

最新更新