Jas*_*onN 6 c c++ gcc inline micro-optimization
函数需要大量的堆栈空间是否会阻止它内联?例如,如果我在堆栈上有一个10k自动缓冲区,是否会使该函数不太可能被内联?
int inlineme(int args) {
  char svar[10000];
  return stringyfunc(args, svar);
}
我更关心gcc,但icc和llvm也很高兴知道.
我知道这不太理想,但我很好奇.缓存上的代码很可能也很糟糕.
是的,内联与否的决定取决于函数的复杂性,其堆栈和寄存器的使用以及调用的上下文.规则依赖于编译器和目标平台.当性能很重要时,请务必检查生成的组件
比较该版本与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);
}
生成的程序集:
inlineme(int):
        sub     rsp, 10008
        mov     rsi, rsp
        call    stringyfunc(int, char*)
        add     rsp, 10008
        ret
test(int):
        jmp     inlineme(int)
与这一个以小得多的10字符数组,这是内联:
inline int inlineme(int args) {
  char svar[10];
  return stringyfunc(args, svar);
}
int test(int x) {
    return inlineme(x);
}
生成的程序集:
test(int):
        sub     rsp, 24
        lea     rsi, [rsp+6]
        call    stringyfunc(int, char*)
        add     rsp, 24
        ret
| 归档时间: | 
 | 
| 查看次数: | 243 次 | 
| 最近记录: |