藤原です。 基本的には、「最適化」は処理系依存ですが…… This message is reply to matsuzono_keiji - san (Subject was : [H8-ML(2019)] volatile宣言(GCC で検証)) Message-ID: <20020627121314T.matsuzono_keiji@xxxxxxxxxxxxxxxxxxxx> in Thu, 27 Jun 2002 12:13:14 +0900 (JST) ... > ソースコード: > ------------------------------------------------------------------- > // io_repeat.c > // IOポートへの書き込みのための代入文が、最適化によって消えてしまう > // ことがあるかテストするプログラム > > #ifdef VOLATILE_DEFINE > volatile int count; > #else > int count; > #endif > > int main(){ > count = 0x01; > count = 0x02; > count = 0x04; > return 0; > } この場合は、volatile 宣言されていれば、最適化されない可能性が非常に 高いです。というか、最適化してはだめです。 まず、voltile 宣言された変数が左辺にありますが、これは、volatile 宣言 された場合、すべて意味のある代入ですので、最適化では削られません。 0x01 と 0x02 の代入の間に、他のプロセスが count を参照する可能性があり ますので。 また、count が、グローバル変数なので、C言語の範囲でも他から参照でき ます。この場合、count がローカル変数なら(実質上意味がなくなりますが) 最適化されないかもしれません。 これに対して、(グローバル変数であっても)volatile 宣言された変数が 右辺にしか(あるいは、単独でしか)現れない場合は、C言語の範疇では、 代入そのものが意味をなくしますので、最適化の結果削除されるかの性があり ます。 int foo(int); volatile int count; int main() { int a; a = count; a = count; a = count; foo(a); return 0; } であれば、a (というか、count )の値は必要ですので、a = count は (ひょっとしたら、1回しか実行されないかも、あるいは、実際には a への代入は発生せずに、直接関数に渡されるかも)とりあえず、 実行、少なくもも、count の値は読まれるでしょうが、 int main() { int a; a = count; a = count; a = count; return 0; } だったら、count は読まれない可能性はかなり高いです。 -- _/ -- Last 78 hours until 2002 World Cup final (27 Jun @211) ------ _/ FUJIHARA Keiichi _/ E-Mail : keiichi@xxxxxxxxxxxxx <or> nagi@xxxxxxxxxxxxxxx _/ URL : http://www.keiichi.fujihara.name/ --------------------------------------------+----- Luna Phase 17.06 -- PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6