g++空函数删除是否递归工作
Does g++ empty function removal work recursively?
据我所知,在以下情况下,启用优化的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.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);
}
编译器不会删除整个函数,链接器会删除。
如果您正在构建可执行文件(或者函数没有从库中导出),则链接器将删除所有孤立函数。如果没有,那就是一个bug:)。
顺便说一句,存储一个函数的地址(例如,在一个变量中或将其传递给另一个函数)可以保证该函数将保持不变。
编辑只是,需要明确的是,优化编译器将内联函数,有效地删除它认为必要的函数调用。在上面的情况下(超简单函数),毫无疑问它会内联它们。BTW、STL实现(以及boost)在很大程度上依赖于此功能。
相关文章:
- 即使没有调用这个递归函数,它是如何工作的?
- 递归函数调用在后台工作
- 这个递归函数是如何工作的?
- 使用 std::map 的递归堆栈分配如何工作?
- 为什么递归向后工作?
- 使用递归的函数未按预期工作
- 在 C++ 中使用递归填充 D2 数组,有时工作正常,其他时会引发异常
- 以下递归程序的最后一行是如何工作的
- 我对变量在递归函数中如何工作的理解是否正确?
- 不明白为什么这个简单的递归开始工作然后崩溃
- Word.exe 已停止使用递归工作
- 递归在此代码中的工作原理
- nqueens问题的C 递归解决方案无法正常工作
- C++中的递归选择不能完全正常工作
- 为什么后缀失败并且前缀在传递迭代器作为参数并在尾部位置递归时工作正常
- 无限递归模板实例化使用clang时GCC工作正常
- 我似乎无法让我的最大长度递归函数工作
- 简单的C++递归无法正常工作 - 我只是不明白为什么
- g++空函数删除是否递归工作
- 模板参数推导是如何递归工作的