
No.3ベストアンサー
- 回答日時:
パソコン上で動かすプログラムを書く人だとあまり使わないかもしれませんね.
ただ, #1の方もおっしゃる様に, ハードウェアに近い分野では必要になる場合もあります.
volatile修飾子がついた変数には最適化が働かなくなります.
たとえば, 次のようなコードがあるとします.
long counter;
printf("a\r\n");
for( counter = 0; counter < 100000; counter++ );
printf("b\r\n");
for( counter = 0; counter < 100000; counter++ );
printf("c\r\n");
上記コードでは, for文で無意味なループを回して無駄時間を作っているつもりです.
a, b, cの間に少しタイムラグができるはずです.
(実際にはとわからないと思いますが)
ただ, 前のコードは実行速度の点でコンパイラから見ても明らかに無駄です.
したがって, コンパイラは次の様な具合にコードを最適化してしまう場合があります. (処理系依存です)
long counter;
printf("a\r\n");
printf("b\r\n");
printf("c\r\n");
counter = 100000;
処理が終わった時点では最初のコードと最適化後のコードは同じ事ですが,
無駄処理で時間稼ぎをしていた部分が無くなってしまいました.
処理速度向上といえばそうですが, これでは困ります.
(なお, counter変数を後で使わない場合は変数の存在自体が無かった事にされたりもします)
そんな時に, counter変数の宣言時にvolatileをつけて
volatile int counter;
といった具合にすると, counter変数に関連する処理は最適化の対象外となるため,
プログラマが書いたとおりに動作するようになります.
なお, 先のコードは説明の為のコードであまり意味がありませんが,
実際だと「メモリマップドI/O」(メモリの特定のところにデータを書き込むと
ハードウェア的に何らかの動作が起こる仕組み)
などをいじる時はvolatile修飾子が必須となります.
likipon様へ
ご回答ありがとうございました。
わかりやすい説明とサンプルを示していただきありがとうございました。やっとvolatileの意味が理解できました。
ウチの開発環境で、volatileの有無で動作にどのような違いがあるのかを試してみたところはっきりと違いがあらわれたので確認することが
できました。ありがとうございました。
No.6
- 回答日時:
参考URLに、最適化される前とされた後のコードが載っています。
非常に単純なコードですので、わかりやすいと思いますよ。
ちなみに、NO3さんの「無駄ループが無くなるのを防ぐ」という目的ですが、volatileをつけても効果がないコンパイラもあると聞いたことがあります。
うろ覚えですが・・・。
基本は、NO3さんの「メモリマップドI/O」とか、NO1さんの並列処理のためではないでしょうか。
PCプログラミングでも、マルチスレッドやソフトウェア割り込みなどで必要になってきますね。
参考URL:http://www.cmagazine.jp/src/kinjite/c/variable.h …
1839cc様へ
ご回答ありがとうございました。
とてもご丁寧に参考URLまで教えていただきまして
感謝しています。ありがとうございました。
>基本は、NO3さんの「メモリマップドI/O」とか、NO1さんの並列処理
なるほど。これからの学習の課題になりそうです。
学習の方向付けが出来ましたことを感謝します。
ありがとうございました。
No.5
- 回答日時:
実は標準ライブラリの中にも、それを使うときはvolatile修飾子を付けることを要求している場合があります。
具体的には、signal関数で登録するシグナル処理ルーチンで操作するsig_atomic_t型の変数であり、setjmpマクロやlongjmp関数を使うときの自動変数です。これらの関数などについて調べてみるとよいでしょう。
# volatile修飾子が気になっているぐらいですから、まったくの初心者ではないと理解しています。
jacta様へ
ご回答ありがとうございました。
ご指摘の関数につきましては、これから一つずつ解決していきたい
と思います。方向付けが出来ましたことを感謝します。
ありがとうございました。
No.4
- 回答日時:
専門的な知識があると非常に役に立ちます。
先に解答された方は知識が豊富でわかりやすい解説がなされています。ならば、私は超簡単に書いてみようかと.....
貴方の友達(コンパイラは友達ですよw)に仕事を依頼しましょう。
仕事内容をメモに書いて渡します。友達はそれに従って仕事をします。
しかし、その内容がそのまま仕事として反映されるわけではなく、『多分問題ないだろう』と友達が判断した場合、何かを省いたり、工程を前後させて速度を優先させる可能性があります。
もし、貴方が友達の勝手な判断を嫌い、最適化を許さないならばvolatileを付けてあげます。
まあ、友達から仕返しは無いと思いますが......使う機会が無いか...
No.2
- 回答日時:
規格上, volatile は「処理系の感知しない原因で値が変化することがある」という意味です. で, 結果として「最適化しない」ということになります.
これがどんな効果を持つかというと, volatile がない場合には処理系が「ああ, この変数の値は変化しないね」と判断するとその値をレジスタ (など) にコピーし, いちいちメモリ (など) から読み込まないことがあります. それに対し, volatile が付いているとその変数を参照するたびに必ず値を調べに行きます.
Tacosan様へ
ご回答ありがとうございました。
とてもわかりやすい説明をありがとうございました。
コンパイラが具体的にどういうときに最適化するのかを確認できる
簡単な実行例があればありがたいのですが、どうかご教授お願いします。

No.1
- 回答日時:
コンパイラに最適化を行う機能があります。
貴方がプログラムを書いた場合、コンパイラはその利用頻度や利用範囲を元に、変数をCPU内レジスタに割り当てるか、RAMに割り当てるかを決めます。
しかし、変数をレジスタに割り当てられては困る場合があります。
たとえば、ハードウェアの制御レジスタは特定のアドレスをアクセスしてR/Wしなければならないので、メモリ上の変数に置き換えられたり、レジスタに割り当てられては役に立ちません。変数の値を変えてもハードウェアの制御レジスタが書き換わらないのでハードウェアは動作せず、バグになってしまいます。
このような変数にvolatile宣言を行うことで、最適化の対象外であることをコンパイラに伝えるのです。
PCですとドライバソフトを書く場合に必須です。
ファームウェアでも常用します。
kazusone様へ
ご回答ありがとうございました。
誤解を恐れずにいうならば、
変数をコンパイルの最適化の対象外にするということは、
コンパイラの判断で変数をレジスタにおくことによって処理を高速化
すると、変数の値が変化してもその変更内容が反映されくなるので、
反映されるようにするためにvolatileを変数に修飾して、
最適化の対象外にするということでよろしいのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 「名詞+形容詞/現在分詞/過去分詞+to不定詞の副詞的用法」の語順について 7 2022/09/22 05:27
- 日本語 〈場所を示す「に」と「で」〉 という誤り 36 2022/11/12 15:04
- 小学校 主語 述語 修飾語 中学受験 1 2022/04/13 11:42
- 英語 提示文の構造等について 2 2022/12/25 23:24
- 英語 "dozen"以外の数の単位が名詞を修飾する場合の"of"の必要性とその理由について 3 2023/04/29 16:03
- 英語 「to不定詞」の形容詞的用法で修飾される名詞が意味上の主語になるか目的語になるのかの判断方法について 1 2023/04/17 09:55
- 英語 日本語の「心」に当てはまる英語はあるのでしょうか。 4 2022/04/02 15:41
- 日本語 国文法(修飾部について)の質問です。 以下の文は修飾部が二つあると解答にはあるのですが、どこにあるの 1 2022/06/16 15:58
- 英語 提示表現の構造について 2 2022/12/01 10:40
- 英語 「子供の頃の大好物」等の『「~の頃の」+名詞』の表現について 8 2022/04/28 11:36
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
Type name expected エラーがで...
-
変数の内容がコロコロ変わる、...
-
パーサとコンパイラの違いって?
-
リリースモードとデバッグモー...
-
サイクルカウントの方法
-
未使用引数の注意文出力を回避...
-
unsigned long long 型のフォー...
-
C言語はC言語でできている?
-
COBOLのALPHABET...
-
printfなど、標準関数のソース...
-
最初に使う変数のゼロクリアに...
-
24bit サイズの変数
-
cc と gcc の違い
-
python エラー
-
エクセルのエラーメッセージ「4...
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
unsigned long long 型のフォー...
-
組み込みソフト。ROM領域にデータ
-
printfなど、標準関数のソース...
-
リリースモードとデバッグモー...
-
VC++の/Zm オプションについて
-
C++でデスクトップGUIアプリ開...
-
COBOLの論理演算子について質問...
-
PICでのI2C通信でのマスタ、ス...
-
Visual Studio でmakefileを使...
-
COBOLのALPHABET...
-
未使用引数の注意文出力を回避...
-
cc と gcc の違い
-
24bit サイズの変数
-
組込みC開発
-
パーサとコンパイラの違いって?
-
変数の内容がコロコロ変わる、...
-
C言語:OS移行時の注意点(Sola...
-
エラー0でのビルド失敗について
-
COBOLの論理演算子について
おすすめ情報