[解決済み] C言語でgccが一部の文を最適化しないようにするには?
2022-07-06 23:50:56
質問
ページをダーティにする(ページテーブルエントリのダーティビットをオンにする)ために、私はこのようにページの最初のバイトをタッチします。
pageptr[0] = pageptr[0];
しかし、実際にはgccはこのステートメントをデッドストアの消去によって無視します。gccが最適化するのを防ぐために、私はこの文を以下のように書き直しました。
volatile int tmp;
tmp = pageptr[0];
pageptr[0] = tmp;
トリックは動作するようですが、やや醜いです。私は同じ効果を持つディレクティブまたは構文があるかどうかを知りたいのですが?そして、私は
-O0
フラグを使いたくありません。
どのように解決するのですか?
最適化をオフにすると問題は解決しますが、それは不要です。 より安全な代替案は、コンパイラがストアを最適化するのを違法とするために
volatile
型修飾子を使用することです。
// Assuming pageptr is unsigned char * already...
unsigned char *pageptr = ...;
((unsigned char volatile *)pageptr)[0] = pageptr[0];
は
volatile
型修飾子は、メモリのストアとロードを厳密に行うようコンパイラに指示します。 の目的の一つは
volatile
の目的の一つは、メモリアクセスには副作用があり、それゆえ保存されなければならないことをコンパイラに知らせることです。 この場合、ストアはページフォルトを引き起こすという副作用があり、コンパイラにページフォルトを保持させたいのです。
この方法では、周囲のコードはまだ最適化することができ、あなたのコードは、GCC の
#pragma
あるいは
__attribute__
の構文があります。
関連
-
C++の配列コピー
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] g++とgccの違いは何ですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] GCC -fPIC オプション
-
[解決済み] gccでC/C++のソースからアセンブラ出力を得るにはどうしたらいいですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み】gcc makefileのエラー。"No rule to make target ..." (ターゲットにするルールがありません)
-
[解決済み】GCCを使用して読みやすいアセンブリを作成しますか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み] LD_PRELOADのトリックとは何ですか?