5

Microsoft Visual C++ (CLI ではなく、標準のネイティブ C++ のみ) を使用する場合、インライン アセンブリによって関数の最適化が無効になりますか?

IDAで確認したところ、ブロック外の関数コードの一部が変わっているようですが、原因がわかりません。この関数は (比較的) 単純で、ビット操作といくつかの計算が含まれていますが、外部呼び出しはありません。

私が考えることができる他の考えられる原因は次のとおりです。

  • インライン アセンブリでのデバッグを有効にする追加のプロビジョニング。
  • 例外処理の変更 (実際にはこのようには見えませんが)
  • 未知のコンパイラ ロジックによる、他の何かの部分的なインライン化。

何か案は?

4

1 に答える 1

13

はい。MSDN の記事を参照してください:インライン アセンブリの最適化とインライン アセンブリ利点

記事から:

関数内にブロックが存在すると、__asmいくつかの点で最適化に影響します。__asmまず、コンパイラはブロック自体を最適化しようとしません。アセンブリ言語で書いたものは、まさにあなたが得るものです。第 2 に、__asm ブロックの存在は、レジスター変数のストレージに影響を与えます。__asmコンパイラーは、ブロックによってレジスターの内容が変更される場合、ブロック全体で変数を登録することを回避し__asmます。最後に、その他の関数全体の最適化は、関数にアセンブリ言語を含めることによって影響を受けます。

于 2012-04-27T20:17:21.943 に答える