Visual Studio - 优化 - 删除未使用的功能

时间:2012-12-19 14:23:18

标签: visual-studio assembly

我在Visual Studio 2012上使用/ opt:ref / VERBOSE选项,除了激活“整个程序优化 - >使用链接时间代码生成”。 / opt:ref应该删除未使用的函数,尽管我认为指定“使用链接时间代码生成”应该默认删除未使用的函数。

在我的测试程序中,我使用了一个测试函数,我希望将其从最终的可执行文件中删除,VS输出似乎确认:

Discarded "int __cdecl testMe(int)" (?testMe@@YAHH@Z) from Test.obj

但是查看使用/ FAs生成的* .asm文件,我可以看到列出的函数:

; Function compile flags: /Ogtp
; File c:\users\g.m\documents\visual studio 2012\projects\Test.cpp
;   COMDAT ?testMe@@YAHH@Z
_TEXT   SEGMENT
?testMe@@YAHH@Z PROC                    ; testMe, COMDAT
 ...

那么,是否从最终图像中移除了它?

修改

要优化的简单代码

static int testMe(int i)
{
    return i + 1;
}

int main()
{
  auto res = testMe(0);
}

我觉得很可疑的是,即使在函数是“静态”的情况下,它仍会出现在* .asm文件中

1 个答案:

答案 0 :(得分:1)

这里似乎发生的事情是编译器在生成程序集时没有完全优化函数(虽然你没有发布完整的列表,也没有发布原始函数,所以很难确定) ,但链接器能够看到它是未引用的,并已将其丢弃。

链接在程序集生成之后发生,因此链接器执行的任何操作都不会由中间程序集输出指示。

只有通过查看最终的可执行文件才能确定,但​​我怀疑链接器说的是实话,并删除了您的功能。

更新

在本地测试您的代码证实了我的怀疑。编译器不会优化死代码,但链接器会这样做。