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也很高兴知道.
我知道这不太理想,但我很好奇.缓存上的代码很可能也很糟糕.
是的,内联与否的决定取决于函数的复杂性,其堆栈和寄存器的使用以及调用的上下文.规则依赖于编译器和目标平台.当性能很重要时,请务必检查生成的组件
比较该版本与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)