【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に0が設定される可能性をコンパイラは排除できない。
だからコード上は一見して無限ループだが、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が指定されているときには
無限ループとして扱ってはならずということになる。
※コメント投稿者のブログIDはブログ作成者のみに通知されます