函数所需的堆栈空间是否会影响C/C++中的内联决策?

Jas*_*onN 6 c c++ gcc inline micro-optimization

函数需要大量的堆栈空间是否会阻止它内联?例如,如果我在堆栈上有一个10k自动缓冲区,是否会使该函数不太可能被内联?

int inlineme(int args) {
  char svar[10000];

  return stringyfunc(args, svar);
}
Run Code Online (Sandbox Code Playgroud)

我更关心gcc,但icc和llvm也很高兴知道.

我知道这不太理想,但我很好奇.缓存上的代码很可能也很糟糕.

rus*_*tyx 6

是的,内联与否的决定取决于函数的复杂性,其堆栈和寄存器的使用以及调用的上下文.规则依赖于编译器和目标平台.当性能很重要时,请务必检查生成的组件

比较该版本与10000炭阵列被内联(GCC 8.2,X64 -O2):

inline int inlineme(int args) {
  char svar[10000];

  return stringyfunc(args, svar);
}

int test(int x) {
    return inlineme(x);
}
Run Code Online (Sandbox Code Playgroud)

生成的程序集:

inlineme(int):
        sub     rsp, 10008
        mov     rsi, rsp
        call    stringyfunc(int, char*)
        add     rsp, 10008
        ret
test(int):
        jmp     inlineme(int)
Run Code Online (Sandbox Code Playgroud)

这一个以小得多的10字符数组,这内联:

inline int inlineme(int args) {
  char svar[10];

  return stringyfunc(args, svar);
}

int test(int x) {
    return inlineme(x);
}
Run Code Online (Sandbox Code Playgroud)

生成的程序集:

test(int):
        sub     rsp, 24
        lea     rsi, [rsp+6]
        call    stringyfunc(int, char*)
        add     rsp, 24
        ret
Run Code Online (Sandbox Code Playgroud)

  • @JasonN 因为 Godbolt 的编译器资源管理器是一个杰作。但更严重的是,您可以随时查看[源代码](https://github.com/mattgodbolt/compiler-explorer)或浏览[他的博客](https://xania.org/)。 (2认同)