こんにちは、神戸の澤です。コメントありがとうございます。 Junsuke Kunugizaさんが03.12.21 2:16に書きました: >> for (; gDMem.SendLength != 0; ) >> ; >これって,ポーリングですよね? そうじゃなければ外してますが(^^; アタリです(^_^;)。 >ループの処理として実際に書かれているコードから判断して,ループの >実行中には変化されえないと見られる変数をあらかじめレジスタに >入れておくのは,最適化の王道ではないでしょうか。変数がメモリ上に >あればあるほど(というのもおかしいですが),無用なメモリ参照を >減らして速くするために,あらかじめレジスタに入れられてしまいます。 まぁ、そりゃそうなんですがねぇ(^_^;)。グローバルでメモリ上に配置されて るのが確実なモンまでそうされるとなるとなんともはや.... #そりゃ、将来的に全ての構造体がレジスタにのっかるような #CPUが出たら別っすけどね(^_^;) >ところが,割り込みの中などで,その場のコードからは予測できない >変化を起こしうる変数を扱うときには,このような最適化が行われては >困るので,そのために volatile というものがわざわざ用意されている >のです。なので,volatile が付いていなければ,バグとは言いにくい >のではないかと。 そう、なので「どちらの」なんすわ。たぶん「ワタシの」バグなんでしょな( T_T)。 >上記のようなループを,ループの中において [変数] が変化することは >ない場合に作っても無意味なのは明らかですから,そのぐらい正しく >判断して残しておいてくれよと言いたくなるのが人情だと思いますが。 >gcc は容赦なく削っちゃいますね。 やっぱり容赦ないっすか。これが秋月環境(元日立?)だときちんと動いてし まってたんですよねぇ。 > int i; > for ( /* nop */ ; (volatile int)i != 0 ; /* nop */ ) ; >みたいに,キャストで局所対応することもできます。実際に volatile な >変数でやるとバグの元なのでおすすめしませんが,宣言で volatile に >するほどの volatile さではないけれど,やや volatile 気味かもって >ケースにどうぞ(どんなケースだ・・)。 うひひ、なんか危険な香りがしますね、これも(^_^;)。でも、グローバルその ものをvolatileにすると今度は他で大量のアラートが出たんで、もしかしたら 参考にするケースがあるやもしれませんね。 -- ## from Kazutaka 'Zak' Sawa (ZakLab) ## ## e-Mail: mailto:zak.k.sawa@xxxxxxxxx ## ## http://homepage1.nifty.com/~zaklab/ ## ## ## ## すべてのメールはバカ者によって盗聴されている可能性があります ##