[解決済み] GCCのif else文における__builtin_expectの利点は何ですか?
質問
を発見しました。
#define
を使用している。
__builtin_expect
.
ドキュメント と書かれています。
内蔵された機能。
long __builtin_expect (long exp, long c)
を使用することができます。
__builtin_expect
を使用すると、コンパイラに分岐を提供することができます。 の予測情報です。一般に、実際の プロファイルのフィードバックに使用されます (-fprofile-arcs
というのも、プログラマは は、自分のプログラムが実際にどのように動作するかを予測することが苦手なことで知られています。 しかし、このデータを収集するのが難しいアプリケーションもあります。の値を返します。
exp
であり、積分値である必要があります。 式で表されます。この組み込みのセマンティクスは、以下のように期待されています。exp == c
. 例えばif (__builtin_expect (x, 0)) foo ();
を呼び出すことは想定していないことを示します。
foo
を想定しているのでx
はゼロになる。
では、なぜ直接使用しないのか。
if (x)
foo ();
という複雑な構文ではなく
__builtin_expect
?
解決方法は?
から生成されるアセンブリコードを想像してください。
if (__builtin_expect(x, 0)) {
foo();
...
} else {
bar();
...
}
みたいな感じでいいんでしょうかね。
cmp $x, 0
jne _foo
_bar:
call bar
...
jmp after_if
_foo:
call foo
...
after_if:
というような順序で指示が並んでいるのがわかります。
bar
の方が先です。
foo
の場合(Cコードとは対照的)。ジャンプはすでにフェッチされた命令をスラッシュするので、これはCPUパイプラインをよりよく利用することができます。
ジャンプが実行される前に、その下の命令(
bar
の場合)はパイプラインにプッシュされます。そのため
foo
が発生する可能性は低く、ジャンプも発生しないので、パイプラインをスラッシングする可能性は低い。
関連
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] Linuxカーネルのprocess/unlikelyマクロはどのように動作し、どのような利点があるのでしょうか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] Linuxカーネルのprocess/unlikelyマクロはどのように動作し、どのような利点があるのでしょうか?