[解決済み] asm、asm volatile、clobbering memoryの違いについて
質問
ロックフリーのデータ構造とタイミングコードを実装する場合、コンパイラの最適化を抑制する必要があることがよくあります。通常、これを行うには
asm volatile
で
memory
を使うことができますが、たまに
asm volatile
または単なる
asm
クラビングメモリー
これらの異なる記述は、コード生成にどのような影響を与えますか(特にGCCでは移植性が低いので)?
参考までに、面白いバリエーションを挙げておきます。
asm (""); // presumably this has no effect on code generation
asm volatile ("");
asm ("" ::: "memory");
asm volatile ("" ::: "memory");
解決方法は?
をご覧ください。 GCC ドキュメントの "Extended Asm" のページです。 .
<ブロッククオート
を防ぐことができます。
asm
というキーワードを記述することで、命令が削除されるのを防ぐことができます。
volatile
の後に
asm
. [...]
volatile
キーワードは、その命令が重要な副作用を持つことを示します。GCCは
volatile
asmに到達可能である場合。
そして
An
asm
出力オペランドを持たない命令は、揮発性のasm
命令です。
どの例も出力オペランドが指定されていないので
asm
と
asm volatile
の動作は同じです。コード内にポイントを作成し、(到達不可能であることが証明されない限り)削除することはできません。
これは、何もしないことと全く同じではありません。 参照
この質問
の例として、ダミーの
asm
この例では、ループを1000回繰り返すコードが、ループの16回の繰り返しを一度に計算するコードにベクトル化されます。
asm
は最適化を阻害する(ループ内の
asm
に1000回到達しなければならない)。
は、その
"memory"
によって任意のメモリが読み書きに使われる可能性があると GCC に思わせます。
asm
ブロックの中でロードやストアの順序を変更することを防ぎます。
これにより、GCCは、アセンブラ命令にわたってレジスタにキャッシュされたメモリ値を保持せず、そのメモリへのストアやロードを最適化しないようになります。
(ただし、CPUが他のCPUに対してロードとストアを並べ替えることは防げません。そのためには本物のメモリバリア命令が必要です)。
関連
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] スタティック・ライブラリとシェアード・ライブラリの違い?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] floatとdoubleの違いは何ですか?
-
[解決済み】定義と宣言の違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】C 未知の型名「my_structure」。
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】 「配列のイニシャライザーはイニシャライザーリストまたは文字列リテラルでなければなりません」と表示されるのですが?
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC