C言語におけるvolatileとかの話

なんか面白げなので、とりあえずとぅぎゃった。必要なtweetが抜け落ちている感があるので、まあその辺は誰か埋めてください。というか、既に誰かとぅぎゃってるような気が…。
9
くまぎ @kumagi

@melponn @aoi_nagatsuki 渡した後で書き換えそうに見えなかったら最適化で勝手にループの外に追い出されたりしちゃうのでその回避の為にもvolatileは無意味じゃないです。順序に関してはCでは何も守ってくれないのでそこはvolatile関係無い感じですね。

2012-02-25 01:05:22
めるぽん.c @melponn

@aoi_nagatsuki それって、xがexportしてる変数、fがxを使うimportしてきた関数だとして、while(x==0){f();} みたいな場合にxにvolatileが必要ってことですか?

2012-02-25 01:08:09
あおいたん @aoi_nagatsuki

@melponn いえす。書き換わらないならwhileで判定しなくて良いじゃん的にif(x==0){while(true)...}にされたら困るっつー

2012-02-25 01:11:00
中村 実 @nminoru_jp

@kumagi Cにも実行モデルはありますよ。volatileのオブジェクトのアクセスは副作用完了点を跨いで逆転することはないので、Cのソースコード上で文として切れているならvolatileアクセスが逆転したアセンブラ命令列に落ちることはないのでは。メモリモデルはまた別の話ですが

2012-02-25 01:14:25
めるぽん.c @melponn

@aoi_nagatsuki それってほんとにvolatile必要なんです?exportしてるのにwhile(true)にするとか狂気の沙汰だと思うんですけど…。

2012-02-25 01:15:38
めるぽん.c @melponn

@aoi_nagatsuki コンパイラとしての動作も知っておきたいですけど、それよりも仕様としてどうなのか知りたいですね…。

2012-02-25 01:20:53
めるぽん.c @melponn

@andochin @aoi_nagatsuki 多分、スレッド間でvolatile有効に活用するのは無理というのは共通認識だと思うので、自分が挙げてる例はシングルスレッドを想定してます。

2012-02-25 01:23:12
くまぎ @kumagi

@melponn @andochin @aoi_nagatsuki シングルスレッドならexportしてようがxに他から干渉されることはなくてwhile(true)にされるのは問題ないと思います。で、シングルスレッドでvolatileを有効活用するのってメモリマップドIOとか…。

2012-02-25 01:26:21
めるぽん.c @melponn

やっぱりよく分からないので、volatile勉強会をやりましょう…!

2012-02-25 01:31:25
くまぎ @kumagi

@nminoru_jp 副作用完了点という言葉をまず知らなかったです。asm volatileも"memory"って付けないとメモリへのアクセスが無いものと見做されて順序を破壊されると思いますが、volatile付きの変数へのアクセスはmemoryって付けたのと似てますか。

2012-02-25 01:32:23
中村 実 @nminoru_jp

@takehiro_t void func(void){int a; a=x ; x=a;} の代入を最適化で消すのは規格違反なんですけどね。ワカリヅライ。

2012-02-25 01:32:48
くまぎ @kumagi

「みんな大好きvolatile」をトゥギャりました。 http://t.co/pH8HTjvi

2012-02-25 01:39:06
中村 実 @nminoru_jp

@kumagi volatile付きの変数へのアクセスはメモリアクセスが生じます。これが原則。ただし前回の副作用完了点と次の副作用完了点の間に最適化できるものはvolatileによるメモリアクセスも含めて削除できます。副作用完了点って、大雑把に言って文の終わりの";"です。

2012-02-25 01:43:24
めるぽん.c @melponn

volatileに対する正しい認識を得るにはやっぱり仕様書を読み解くしか無いのか…

2012-02-25 01:45:01
くまぎ @kumagi

@nminoru_jp 最適化出来るものであっても明示的に禁止するのがvolatileだと思ってたのですが、最適化出来る場合に削除されちゃうのですか…。それと僕の理解だとその仕様ならC++11でわざわざメモリ順序まで言語仕様で規定してやる必要が無いのではないでしょうか?

2012-02-25 01:49:10
中村 実 @nminoru_jp

@kumagi C言語の実行モデルはシグナルに対する安全性を保障するためのもので、マルチスレッドのことはほとんど考えてないので。

2012-02-25 01:52:16
くまぎ @kumagi

@nminoru_jp volatileを付ければセミコロンを跨いだリオーダが行われない、まであれば、とりあえずアセンブラに落とすまででのvolatileの役割はひと通り大丈夫かと思いましたがそこにメモリバリアを足すのがC++11、という位置付けですか。

2012-02-25 01:54:03
くまぎ @kumagi

@nminoru_jp ありがとうございます、一層腑に落ちました。

2012-02-25 02:12:48
中村 実 @nminoru_jp

「 まりあ†ほりっく 9」を購入。もしかしてかなこさんが表紙の巻はナッシングなの? http://t.co/zwRS34tC

2012-02-25 02:15:50
拡大