switch语句中的死代码消除

时间:2015-11-03 15:07:18

标签: c compiler-optimization c99 dead-code

想象一下静态库(* .a,* .lib)中存在以下函数:

int func_foo(int i) {
    switch (i) {
    case 1:
        return foo_bar();
    case 2:
        return foo_baz();
    case 3:
        return foo_bat();
    default:
        return -1;
    }
}

如果此库的用户调用此函数并且只传入1,编译器是否(或可以)删除对23的调用?

如果在任何其他函数中没有引用foo_baz()foo_bat()函数(也就是死代码消除),编译器是否也会删除它们?

1 个答案:

答案 0 :(得分:2)

如果Whole Program Optimization已启用且func_foo未标记为从输出共享对象库或DLL导出,则像MSVC这样的合适编译器可以并将删除此类死代码。因此,代码看起来像这样(当然忽略函数内联):

int func_foo(int i) {
    return foo_bar();
}

否则,如果未启用WPO且func_foo具有外部链接(默认值),则编译器无法删除死代码。最后,如果未启用WPO且func_foo具有静态链接,则编译器可以删除死锁。在最后一种情况下,MSVC没有执行优化。其他编译器可能会执行它。

  

如果编译器还会删除foo_baz()和foo_bat()函数   他们没有在其他任何职能中被引用?

同样取决于WPO是打开还是关闭,如果它关闭,它取决于功能的链接。在所有情况下,都不得导出函数。此外,您必须通过使用编译器开关明确告诉编译器删除未引用的函数。例如,在MSVC中,您必须使用/Gy编译器开关和/OPT:NOREF链接器开关。