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
,编译器会(或可以)删除对 2
和 3
的调用吗?
如果 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 链接器开关。
假设静态库(*.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
,编译器会(或可以)删除对 2
和 3
的调用吗?
如果 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 链接器开关。