[解決済み] volatile int * p "のような揮発性ポインタはなぜ有用なのですか?
質問
volatile
は、参照を最適化しないようにコンパイラに指示することで、すべての読み取り/書き込みがレジスタに格納された値を使用せず、実際のメモリアクセスを行うようにします。私はこれが普通の変数に有用であることは理解できますが、どのように
volatile
がポインタにどのように影響するのか理解できません。
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
と宣言されている場合、何が違うのでしょうか?
int *p = some_addr
?
どのように解決するのですか?
フォームのポインタ
volatile int* p;
へのポインタです。
int
へのポインタで、コンパイラはこれを
volatile
. つまり、コンパイラは、変数
p
が指す変数が変更された可能性があるとコンパイラが判断することを意味します。 例えば、もし私が
p
を通常の整数を指すように設定した場合、 読み書きのたびに
*p
を読み書きするたびに、コンパイラはその値が予期せず変更された可能性があることを認識します。
もう一つの使用例として
volatile int*
: もしあなたが
int
として
volatile
を指定した場合、通常の
int*
. 例えば、こんなのはダメです。
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
この理由は,C コンパイラが
ptr
が
volatile
の値をキャッシュしている可能性があります。
*ptr
の値をレジスタに不正にキャッシュしてしまうかもしれません。実際、C++では、上記のコードはエラーになります。 その代わり、こう書くべきです。
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
ここで、コンパイラは
ptr
を指していることを記憶しています。
volatile int
を指しているため、このメソッドは
*ptr
.
最後にもう一つ細かいことを言うと、あなたが議論したポインタは
volatile int
. こんなこともできます。
int* volatile ptr;
これは、ポインタ
自体
は
volatile
であるため、コンパイラはポインタをメモリにキャッシュしたり、ポインタ値が他の何か(ハードウェアなど)によって再割り当てされるかもしれないので、最適化しようとしてはいけないことを意味します。 この獣を手に入れたいなら、これらを組み合わせてもよいでしょう。
volatile int* volatile ptr;
これは、ポインタと被指定者の両方が予期せず変更される可能性があるということです。コンパイラはポインタ自体を最適化することはできませんし、指されているものを最適化することもできないのです。
これが役に立つといいのですが。
関連
-
C++の配列コピー
-
関数 'malloc' の暗黙の宣言に対する解決策
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] volatileキーワードは何に役立つのでしょうか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語の構造体(CGRectやCGPointなど)をNSLog化することは可能ですか?
-
[解決済み] なぜ 'this' はポインターで、参照ではないのですか?
最新
-
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を初めて使うときの落とし穴
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] C関数から文字列を返す
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] なぜ16進数には0xがつくのですか?