g++空函数删除是否递归工作

Does g++ empty function removal work recursively?

本文关键字:递归 工作 是否 删除 函数 g++      更新时间:2023-10-16

据我所知,在以下情况下,启用优化的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语句是否也会被删除,因为即使条件为true,它也会执行死代码?

在情况2:中,是否会删除foo2中对foo的调用?

根据评论中的建议,我自己尝试了一下,在我描述的两种情况下,至少对于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);
}

编译器不会删除整个函数,链接器会删除。

如果您正在构建可执行文件(或者函数没有从库中导出),则链接器将删除所有孤立函数。如果没有,那就是一个bug:)。

顺便说一句,存储一个函数的地址(例如,在一个变量中或将其传递给另一个函数)可以保证该函数将保持不变。

编辑只是,需要明确的是,优化编译器将内联函数,有效地删除它认为必要的函数调用。在上面的情况下(超简单函数),毫无疑问它会内联它们。BTW、STL实现(以及boost)在很大程度上依赖于此功能。