ナカナカピエロ おきらくごくらく

写真付きで日記や趣味を書くならgooブログ

【C言語】C言語のvolatileとは

2022-05-08 18:40:19 | 日記
【C言語】C言語のvolatileとは

volatileは「揮発性」という意味を持つC言語の型修飾子である。

大抵の人は、何のためにvolatileなるものがあるのか分からないまま、

volatileを使うことなくC言語でコーディングしてしまう人が多いと思う。

volatileを指定された変数は語源の通り、その値はその都度変わるため、

変数を参照するときには、大元の実体が格納されているメモリ

(スタック or グローバル or ヒープ)から必ずload命令を発行して値を

取り直さなければならない。

よってvolatileを指定された変数は一部のコンパイラ最適化を抑止する。

https://docs.oracle.com/cd/E19957-01/805-7885/6j7dqggcu/index.html

に記載があるように通常は以下の変数(オブジェクト)に使用される。

・メモリーにマップされた入出力ポートであるオブジェクト

・複数の並行プロセス間で共有されるオブジェクト

・非同期シグナルハンドラによって変更されるオブジェクト

・setjmp を呼び出す関数中で宣言され、その値が setjmp への呼び出し

 とそれに対応する longjmp への呼び出し間で変更される自動記憶オブジェクト

つまり一見、コード上変更がないため、そのまま値が変わらないであろうと

思われる変数でも変わる可能性があるため、必ず大元の実体から値を取って

こなければ駄目だよ、とコンパイラに暗にほのめかしているのである。

もし以下のコードのflagにvolatile指定があったとき、


flag = 1;
while (flag)
;


何らかの形で、flagに0が設定される可能性をコンパイラは排除できない。

だからコード上は一見して無限ループだが、volatileが指定されているときには

無限ループとして扱ってはならずということになる。
コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 裏切り | トップ | 【C++言語vsJava言語】C++テ... »
最新の画像もっと見る

コメントを投稿

日記」カテゴリの最新記事