C言語におけるvolatileとかの話
@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@aoi_nagatsuki それってほんとにvolatile必要なんです?exportしてるのにwhile(true)にするとか狂気の沙汰だと思うんですけど…。
2012-02-25 01:15:38@andochin @aoi_nagatsuki 多分、スレッド間でvolatile有効に活用するのは無理というのは共通認識だと思うので、自分が挙げてる例はシングルスレッドを想定してます。
2012-02-25 01:23:12@melponn @andochin @aoi_nagatsuki シングルスレッドならexportしてようがxに他から干渉されることはなくてwhile(true)にされるのは問題ないと思います。で、シングルスレッドでvolatileを有効活用するのってメモリマップドIOとか…。
2012-02-25 01:26:21@nminoru_jp 副作用完了点という言葉をまず知らなかったです。asm volatileも"memory"って付けないとメモリへのアクセスが無いものと見做されて順序を破壊されると思いますが、volatile付きの変数へのアクセスはmemoryって付けたのと似てますか。
2012-02-25 01:32:23@takehiro_t void func(void){int a; a=x ; x=a;} の代入を最適化で消すのは規格違反なんですけどね。ワカリヅライ。
2012-02-25 01:32:48@kumagi volatile付きの変数へのアクセスはメモリアクセスが生じます。これが原則。ただし前回の副作用完了点と次の副作用完了点の間に最適化できるものはvolatileによるメモリアクセスも含めて削除できます。副作用完了点って、大雑把に言って文の終わりの";"です。
2012-02-25 01:43:24@nminoru_jp 最適化出来るものであっても明示的に禁止するのがvolatileだと思ってたのですが、最適化出来る場合に削除されちゃうのですか…。それと僕の理解だとその仕様ならC++11でわざわざメモリ順序まで言語仕様で規定してやる必要が無いのではないでしょうか?
2012-02-25 01:49:10@kumagi C言語の実行モデルはシグナルに対する安全性を保障するためのもので、マルチスレッドのことはほとんど考えてないので。
2012-02-25 01:52:16@nminoru_jp volatileを付ければセミコロンを跨いだリオーダが行われない、まであれば、とりあえずアセンブラに落とすまででのvolatileの役割はひと通り大丈夫かと思いましたがそこにメモリバリアを足すのがC++11、という位置付けですか。
2012-02-25 01:54:03「 まりあ†ほりっく 9」を購入。もしかしてかなこさんが表紙の巻はナッシングなの? http://t.co/zwRS34tC
2012-02-25 02:15:50