2012-04-27 9 views
5

Microsoft Visual C++(CLIではなく、標準のネイティブC++)を使用している場合、インラインアセンブリの原因最適化をその関数で無効にしますか?インラインアセンブリ(__asm)ブロックは関数の最適化を妨げますか?

IDAを使用してチェックしたとき、ブロック外の機能コードの一部が変更されているように見えますが、その原因がわかりません。この関数は(比較的)シンプルで、ビット操作と数学を含みますが、外部呼び出しはありません。私は考えることができ

その他の原因としては、次のとおりです。

  • エクストラプロビジョニングはインラインアセンブリでのデバッグを可能にします。
  • 例外処理の変更(実際にはこのようには見えません)
  • 未知のコンパイラロジックによる部分的なインライン展開。

答えて

13

はい。 MSDNの記事を参照してください。Optimizing Inline AssemblyなどAdvantages of Inline Assembly

を記事から:

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

+0

ああ、いくつかの*が*すべての*最適化を無効にします。それは私の質問に完全に答えます。ありがとう。 – Polynomial

関連する問題