g ++空函数删除是否递归?

时间:2013-12-09 10:37:30

标签: c++ c gcc g++

据我所知,启用优化的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中,是否会删除foofoo2的来电?

2 个答案:

答案 0 :(得分:1)

根据评论中的建议,我自己尝试了这一点,似乎在我描述的两种情况下,空函数调用确实被删除并且完全,至少对于gcc 4.8.1g++ 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)在很大程度上依赖于这个功能。