代码之家  ›  专栏  ›  技术社区  ›  Jagdish

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

  •  0
  • Jagdish  · 技术社区  · 7 年前

    下面的函数需要堆栈来执行吗?

    int a;
    void func(void)
    {
        a = 10;
    }
    
    0 回复  |  直到 7 年前
        1
  •  2
  •   Eric Postpischil    7 年前

    只要一个C编译器就可以看到定义 func 它可以 实施 芬克 不使用任何堆栈空间。例如,当它看到 芬克 它可以通过发出一两个指令来移动10。 a . 这将获得与调用相同的结果 芬克 作为一个子例程,所以C规则允许C实现实现对 芬克 以这种方式,它不使用任何堆栈空间。

    通常,如果编译器看不到 芬克 ,就像编译另一个调用 芬克 但是如果不定义它,编译器将不得不发出一个调用指令或类似的东西,这至少会将返回地址推送到堆栈上。

    另外,如果被调用的例程更复杂,编译器可能选择不内联实现它,也可能无法这样做。(例如,如果 芬克 包含对自身的调用,编译器通常不可能在所有情况下都使用内联代码来实现它;编译器将需要使用实际的子例程调用指令来实现它,这些指令使用堆栈空间。)

    脚注

    任何特定编译器是否将实现 芬克 不使用堆栈空间是另一回事,这取决于编译器、用于编译的开关和其他因素。