2009-08-30 13 views
34

私は多くの乗算とポインタ算術を最適化しようとしており、最適化フラグを入れるときにコンパイラが何をするのかを見たいと思っています。特定の機能またはコードブロックにそれを制限する方法C/C++プログラムのgcc(任意のフレーバ)コンパイラによって生成されたアセンブリコードを確認するにはどうすればよいですか?

--Edit--

? gccはそれほど冗長アセンブリ・コードを生成させる方法

--Edit_2--

+2

あまり詳しくないアセンブリですか?それはどういう意味ですか? –

+0

アセンブリコード。言い換えれば、活性化レコードの初期化などの非常に大切なことはしたくないのですが、コードだけが私のstatemetnsに関連しています。それがより明確になることを願っています。 – vehomzzz

+1

gccにあなたの美しさだけを満たす_incorrect_アセンブリコードを生成させたいのですか?いいえ。 –

答えて

35

-Sをコマンドラインに追加してください。

編集:-oスイッチで指定したファイルにアセンブリが配置されることを忘れないでください。

+0

'gcc -O3 -march = native foo.c -S -o- | 'を使うことができます。 '.s'ファイルを作成するのではなく、' less'にパイプするのは 'less'です。 [GCC/clangアセンブリ出力からノイズを除去する方法](https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output)も参照してください。 ** Matt GodboltのCppCon2017トーク:特に、「私のコンパイラは最近私のために何をしましたか?コンパイラの蓋を解く」](https://youtu.be/bSkpMdDe4g4)** –

9

特定の機能またはコードブロックに制限する方法はありますか。

この機能を別のソースファイルに置きます(そのソースファイルには別のコマンドラインパラメータを使用します)。

+1

これは私がやっていることです。私はそれが単なるオプションから可能であるかどうか不思議です。 – vehomzzz

+0

これは、呼び出し側にインライン展開できる場合、実際に最適化された方法を反映していない可能性があります。 (特に、リンク時の最適化を伴う)。1つのパラメータであってもコンパイル時定数が大きい場合は大きな違いがあり、配列のアラインメントやサイズがわかっていると、自動ベクトル化が多く変更される可能性があります。しかし、はい、これは良いことです*あなたが何をしているのか理解していれば –

2

Visual Studioデバッガのブレークポイントでプログラムを停止し、 "show assembly"を実行して、一度に1命令ずつステップ実行することもできます。

+3

この回答はなぜ投票停止になったのですか?これは完全に有効な応答です。 – aaronsnoswell

+1

@aaronsnoswell私はそれをやっていませんでしたが、恐らく質問はGCCに関するものなのでしょう。 – delicateLatticeworkFever

4

gdbのようなデバッガでそのプログラムを実行し、逆アセンブリビューを使用することもできます。 gdbでは、コマンドdisass/mを使用して、現在の場所のCコードと混在しているアセンブリを表示することができます。

+0

最小限の例を追加できますか? 'disass/m'は'フレームが選択されていません 'と表示します。 –

関連する問題