【问题标题】:Visual Studio - optimization - remove unused functionVisual Studio - 优化 - 删除未使用的函数
【发布时间】:2012-12-19 23:43:45
【问题描述】:

我在 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);
}

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

【问题讨论】:

    标签: visual-studio assembly


    【解决方案1】:

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

    链接发生在程序集生成之后,因此链接器所做的任何事情都不会由中间程序集输出指示。

    只有查看最终的可执行文件才能确定,但​​我怀疑链接器说的是真话,并删除了你的函数。

    更新:

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

    【讨论】:

    • 正如我所怀疑的,编译器生成了函数(可能是因为您在代码中引用了它),但链接器将其删除。
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 2011-08-05
    • 2019-01-25
    • 1970-01-01
    • 2019-03-09
    • 2018-12-20
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多