volatile const

volatileとconst同時につけるとかいみわかんねーよという話

constはわかりやすいと思うんでvolatileに着目すると、volatileの意味するところは「揮発性の」つまりすぐに変わってしまうという意味を持ちます。
これは、ハードウェア要因なり割り込みなりで変数の値がプログラムで制御できないタイミングで書き換えられるってことです。
これを単に「最適化を抑止する」とだけ覚えていると意外とハマります。最適化ってのは予測可能・置換可能だから最適化できるので、値の変化を予測できない変数は最適化してはいけないのです。
つまり、volatile修飾子をつけた変数はありのままの姿でRAMに配置するのがあるべき姿になります。
ここまではいいのですが、問題はvolatileとconstを同時につけた場合・・・「任意のタイミングで値が書き換わる可能性のある定数」って意味わかんねぇよ。
しかし困ったことに、某社の一部部署ではやたらと定数にvolatile constをつけたがる。
同時につけてどうなるかというと・・・結果はコンパイラ次第。constを優先してROMに配置するコンパイラもあれば、volatileを優先してRAMに配置するコンパイラもあります。Cの言語仕様でも明確に定義されているわけではなく(私はRAMに配置すべきだと解釈しましたが)、リンクしてはじめて「なんかやたらとRAMを食いつぶしてるぞ?」となるのです。
エンプラ系のエンジニアはピンとこないかもしれませんが、組み込みシステムにおいてRAMは限られた資源なのです。マルチメディア系だとさすがに数MB載ってたりしますが、数百KB程度はザラにあります。そんなところに定数テーブルなんぞ置かれた日にはもう目も当てられません。

ちなみに最近はやりのARMは純正コンパイラがRAM配置タイプだから、volatileとconstは同時につけないほうがいいよ。

2016年4月2日 4:19 AM カテゴリ: テクノロジ タグ: , , , ,
コメント (RSS) トラックバック

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment