【发布时间】:2013-12-09 10:37:30
【问题描述】:
据我所知,在以下情况下,启用优化的g++ 将完全删除对bar 的函数调用:
int bar() { }
int foo() { bar(); }
但是,考虑以下两种情况,bar 定义如上:
案例一:
int foo(int a, int b) {
if (a > b) bar();
}
案例 2:
int foo() { bar(); }
int foo2() {foo(); }
在情况 1 中,if 语句是否也会被删除,因为即使条件为真,它也会执行死代码?
在案例 2: 中,foo2 内部对 foo 的调用是否会被移除?
【问题讨论】:
-
看反汇编。并不难看到。
-
你知道你可以试试看吗?例如,使用 GCC 的 -S 选项来编译而不是汇编,那么您将能够相当容易地阅读它在做什么。
-
@JohnZwinck,我会试试的。我最初对 disas 犹豫不决,因为我不确定要查找什么,因为我猜编译器会内联。
-
简而言之,您可以期望删除所有代码,但没有任何保证。该标准允许优化范围,但一般不指定何时必须应用它们。因此,您的问题最好根据
g++观察到的行为来回答——因为您的问题具有该标签。会发生什么取决于版本和编译器标志 - 你为什么不自己尝试一下?另外,“死代码”是指由于在运行时无法满足执行的分支条件而永远无法执行的代码:您只有一个空函数,而不是死代码。 -
请注意,您看到的并不是专门的“死代码删除”,而是内联无操作的副作用。