2

「プログラム全体の最適化->リンク時コード生成の使用」をアクティブにしたほかに、Visual Studio2012で/opt:ref/VERBOSEオプションを使用します。/ opt:refは未使用の関数を削除することになっていますが、「リンクタイムコード生成を使用する」を指定すると、デフォルトで未使用の関数が削除されるはずだという印象を受けました。

私のテストプログラムでは、最終的な実行可能ファイルから削除されると予想されるテスト関数を使用していますが、VS出力で次のことが確認されているようです。

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

しかし、/FAで生成された*.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ファイルに表示されていることです。

4

1 に答える 1

1

ここで起こっているように見えるのは、コンパイラがアセンブリの生成時に関数を完全に最適化していないことです(ただし、完全なリストも元の関数も投稿していないため、確認するのは困難です)。リンカはそれが参照されていないことを確認でき、それを破棄しました。

リンクはアセンブリ生成後に発生するため、リンカーが行うことは、中間アセンブリ出力によって示されません。

最終的な実行可能ファイルを見れば確実にわかりますが、リンカーが真実を語っていて、関数が削除されているのではないかと思います。

アップデート:

コードをローカルでテストすると、私の疑いが確認されます。コンパイラはデッドコードを最適化しませんが、リンカは最適化します。

于 2012-12-19T15:09:26.673 に答える