10

从这个简单的 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作为死代码被淘汰?

4

1 回答 1

20

编译器必须考虑存在另一个翻译单元想要调用的可能性nothing()。因此无法删除。它最多可以做的是优化它的调用,但是函数本身必须保留并且它的符号被导出以供可能的外部使用。

通过定义nothingas static,你可以给它internal links,这意味着编译器可以假设nothing在它现在看到的代码之外是不可访问的。这允许优化,例如选择不同的性能更高的调用约定,或者在您的情况下,完全消除该函数。

于 2016-05-28T04:19:51.427 回答