想象一下静态库(* .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()
函数(也就是死代码消除),编译器是否也会删除它们?
答案 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链接器开关。