@melponn 言語の保証:最適化しない。 有効活用:volite メンバー関数とか const volite メンバー関数とか作れる。
2012-02-25 00:36:42@wraith13 綴り…それはさておき、volatileは組込だと使われます。必ずアクセスしてほしい周辺ICのレジスタへのポインタをvolatileにしたり
2012-02-25 00:43:00あれ、Cのvolatileは読み書き順序には頓着してくれないんだよねぃ?最適化で消えないというだけで。そしてasm volatile("" ::: "memory")をコリコリと書けばコンパイル後の読み書き順序も守ってくれるけど、CPUの実行順序までは整列できない。
2012-02-25 00:46:59@melponn なんか書いてるだけに見えるから消すーとかされると他のスレッドから読んでるーとかの時に困ったり困ったりとかとか
2012-02-25 00:49:36volatileは x=0; while(x==0){} のように、コンパイラにとって最適化したくてたまらないような状況(この例ならwhile(true){}に最適化される)であっても、コンパイラに「マテ!」と明示できるのです便利ですね(棒
2012-02-25 00:52:28@aoi_nagatsuki @melponn それは異なる翻訳単位になるのでは?その場合外部リンケージを持つからvolatileと関係なく消されないような。但しどこからも参照されなければリンカが消す可能性はありますが
2012-02-25 00:53:34@aoi_nagatsuki 変なキャストをしない限りスレッドにその値のポインタを渡そうとするコード書いた時点で消されないでしょうし、スレッドだと読む際に不定な値にならなくても順序は保証されなかったはずなので、スレッドではまともに使えないという脳内結論が…。
2012-02-25 00:56:02@SillyCrown C言語のvolatileはマルチスレッドでも話が変わってくれないんです。Javaなら仰る通りメモリバリアを入れてくれるのですが、C言語の場合はvolatileがやってくれる事がとても少ない事を念頭に入れる必要が有ります。
2012-02-25 00:56:28@melponn のでまあ値書きかえてないならここじゃなくていいよねー的にコードが移動されたりしたくなかったらvolatileなってことで。たとえば翻訳単位外で値が書きかえられる様なエニシングを条件式に使うとか
2012-02-25 01:00:15@melponn @aoi_nagatsuki 渡した後で書き換えそうに見えなかったら最適化で勝手にループの外に追い出されたりしちゃうのでその回避の為にもvolatileは無意味じゃないです。順序に関してはCでは何も守ってくれないのでそこはvolatile関係無い感じですね。
2012-02-25 01:05:22@aoi_nagatsuki それって、xがexportしてる変数、fがxを使うimportしてきた関数だとして、while(x==0){f();} みたいな場合にxにvolatileが必要ってことですか?
2012-02-25 01:08:09@melponn いえす。書き換わらないならwhileで判定しなくて良いじゃん的にif(x==0){while(true)...}にされたら困るっつー
2012-02-25 01:11:00@kumagi Cにも実行モデルはありますよ。volatileのオブジェクトのアクセスは副作用完了点を跨いで逆転することはないので、Cのソースコード上で文として切れているならvolatileアクセスが逆転したアセンブラ命令列に落ちることはないのでは。メモリモデルはまた別の話ですが
2012-02-25 01:14:25