据我所知,启用优化的g++
会在以下情况下完全删除对bar
的函数调用:
int bar() { }
int foo() { bar(); }
但是,请考虑以下两种情况,bar
定义如上:
案例1:
int foo(int a, int b) {
if (a > b) bar();
}
案例2:
int foo() { bar(); }
int foo2() {foo(); }
在案例1中,if
语句是否也会被删除,因为即使条件为真,它也会执行死代码?
在案例2中,是否会删除foo
内foo2
的来电?
答案 0 :(得分:1)
根据评论中的建议,我自己尝试了这一点,似乎在我描述的两种情况下,空函数调用确实被删除并且完全,至少对于gcc 4.8.1
和g++ 4.8.1
。
我编译了以下两个程序,首先是gcc -S
,然后是gcc -S -O2
。
计划1:
int bar() { }
int foo() { bar(); }
int main() {
foo();
}
计划2:
int bar() { }
int foo(int a, int b) {
if (a > b) bar();
}
int main() {
foo(2,1);
}
我还试过从命令行传入的foo
个参数,以确保删除不是因为常量传递给foo
。
int main(int argc, char** argv) {
foo(argc,1);
}
答案 1 :(得分:0)
编译器不会删除整个函数,链接器会这样做。
如果您正在构建可执行文件(或者函数未从库中导出),则链接器将删除所有孤立函数。如果没有,那就是一个错误:)。
顺便说一句,存储函数的地址(例如在变量中或将其传递给另一个函数)保证函数将保留。
修改强> 只是,为了清楚起见,优化编译器将内联函数,有效地删除它认为必要的函数调用。在上面的例子中(超简单函数),毫无疑问它会内联它们。 BTW,STL实现(和boost)在很大程度上依赖于这个功能。