switch 语句中的死代码消除

Dead code elimination in switch statement

假设静态库(*.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() 函数未在任何其他函数中引用(也称为死代码消除),编译器是否也会删除它们?

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

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

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

Will the compiler also remove the foo_baz() and foo_bat() functions if they're not referenced in any other functions?

同样,这取决于WPO 是打开还是关闭,如果关闭,则取决于函数的链接。在所有情况下,不得导出函数。此外,您必须使用编译器开关显式告诉编译器删除未引用的函数。例如,在 MSVC 中,您必须使用 /Gy compiler switch and the /OPT:NOREF 链接器开关。