从这个简单的C程序开始:
void nothing(void) {}
int main() {
int i;
for (i = 0; i < 10; ++i) {
nothing();
}
return 0;
}
我的传球输出如下:
注意:IR声明为绿色。
; Function Attrs: nounwind readnone ssp uwtable
define void @nothing() #0 {
entry:
ret void
}
; Function Attrs: nounwind readnone ssp uwtable
define i32 @main() #0 {
entry:
ret i32 0
}
问题:使用O3
认为最高级别的优化,为什么 nothing
功能已被淘汰-code? p>
答案 0 :(得分:18)
编译器必须考虑另一种翻译单元想要调用nothing()
的可能性。因此无法将其删除。它可以做的最多是优化其调用,但函数本身必须保留并导出其符号以供外部使用。
通过将nothing
定义为static
,您可以给它internal linkage,这意味着编译器可以假定nothing
在其目前看到的代码之外无法访问。这允许进行优化,例如选择不同的更高性能的调用约定,或者在您的情况下,完全消除该函数。