C++をコンパイルするときに最適化フラグを追加すると、実行速度は向上しますが、どのように動作しますか?誰かが本当に議会で何が起こっているのか説明できますか?コードを最適化する際に、アセンブリでコンパイラは何をしますか?つまり-O2フラグ
8
A
答えて
13
コンパイル時に余計な作業や解析を行うので、実行時にいくつかの貴重なCPUサイクルの報酬を得ることができます。例を挙げて説明するのが最善でしょう。
このようなループを考えてみましょう:
const int n = 5;
for (int i = 0; i < n; ++i)
cout << "bleh" << endl;
あなたは最適化せずにこれをコンパイルする場合、コンパイラはあなたのための余分な作業を行うことはありません - アセンブリこのコードスニペット用に生成比較にそう直訳になりますジャンプ命令。あなたが最適化してコンパイルすると、それは知っているのでn
がconst
あるので(これは最速ではありません、ただ最も簡単)
しかし、コンパイラが簡単にinline
このループ上限はこれまでに変更することはできません。 (すなわち、ループ終了条件を比較/チェックする代わりに、繰り返しコードを5回直接コピーすることができる)。
ここでは、最適化された関数呼び出しを使用した別の例を示します。以下は私の全体のプログラムです:
#include <stdio.h>
static int foo(int a, int b) {
return a * b;
}
int main(int argc, char** argv) {
fprintf(stderr, "%d\n", foo(10, 15));
return 0;
}
私は私のx86マシン上でgcc foo.c
を使用して最適化をせずにこのコードをコンパイルする場合は、私のアセンブリは次のようになります。ここでは
movq %rsi, %rax
movl %edi, -4(%rbp)
movq %rax, -16(%rbp)
movl $10, %eax ; these are my parameters to
movl $15, %ecx ; the foo function
movl %eax, %edi
movl %ecx, %esi
callq _foo
; .. about 20 other instructions ..
callq _fprintf
、それが何かを最適化していません。私の定数値をレジスタにロードし、私のfoo
関数を呼び出しています。私は-O2
フラグ付きで再コンパイルした場合でも、見て:
movq (%rax), %rdi
leaq L_.str(%rip), %rsi
movl $150, %edx
xorb %al, %al
callq _fprintf
コンパイラが、それももうfoo
を呼び出さないようにスマートです。戻り値だけをインラインで入力します。
0
最適化のほとんどは、アセンブリが生成される前にコンパイラの中間表現で行われます。あなたは間違いなくAgner FogのSoftware optimization resourcesをチェックしてください。第1章の第8章では、コンパイラによるサンプルの最適化について説明します。
関連する問題
- 1. Goコンパイラに最適化フラグを渡す?
- 2. gcc最適化フラグ - 実際に書かれたコードについて何か意味がありますか?
- 3. g ++最適化:O2フラグは、O3が再び破損した場合に壊れたコードを修正します
- 4. コンパイラは繰り返しコードを自動的に最適化しますか?
- 5. コンパイラはいつマイコードを最適化するのですか?
- 6. 最も最適なコンパイラのフラグとコンフィギュレーションでもっとも最適なコンパイラのフラグとコンフィギュレーションを持つcmakeのHalideジェネレータを実行しています。
- 7. コンパイラはメソッド呼び出しを最適化できますか?
- 8. 特定のコード行に対してコンパイラの最適化を無効にする方法はありますか?
- 9. jQueryコードを最適化しますか?
- 10. C++コンパイラは未使用の戻り値を `reference`で最適化しますか?
- 11. C#JITコンパイラはヌルチェックを最適化しますか?
- 12. Doポインタはコンパイラの最適化を阻害しますか?
- 13. C++:コンパイラは&変数を最適化しますか?離れて?
- 14. FPGA言語のコンパイラは最適化を実行しますか?
- 15. C/C++コンパイラはこのif文を最適化しますか?
- 16. コンパイラは未使用のプライベートメソッドを最適化しますか?
- 17. C#コンパイラ/最適化コマンドラインオプションはJITterに影響しますか?
- 18. Python、マルチプロセッシング:コードを最適化するには?コードを高速化しますか?
- 19. Mavenビルド中にJavaコンパイラを最適化しますか?
- 20. Cコンパイラはオブジェクトファイル全体を最適化できますか?
- 21. Kotlinコンパイラはラッパー関数を最適化できますか?
- 22. C/C++でオブジェクトを作成する際のコンパイラの最適化の境界は何ですか?
- 23. コンパイラでコードを最適化した後に一時変数を取り除く
- 24. Microsoft C++コンパイラ:/ O2で自動ベクトル化を無効にする方法はありますか?
- 25. Angular JSの国際化に最適なアプローチは何ですか?
- 26. C#コンパイラまたはJITのどのレベルでアプリケーションコードを最適化しますか?
- 27. Python最適化(-OまたはPYTHONOPTIMIZE)は何をしますか?
- 28. JITコンパイラは不要な変数宣言を最適化(インライン化)しますか?
- 29. ms vC++コンパイラが誤ったコードを最適化する
- 30. コンパイル時のテンプレートとconstexprの控除コンパイラと最適化フラグによって異なります
非常に涼しい!関数を呼び出すようなことをしているときに違いがありますか? – kayla
@TidusSmithは深い例でより多くの答えを更新しました。あなたはそれが有用であることを願っています。 – yamafontes