藤原です。
直接の回答にはなってないのですが、
This message is reply to matsuzono_keiji - san
(Subject was : [H8-ML(2017)] 最適化の抑制(SHC V7で酷い目に))
Message-ID: <20020627091429R.matsuzono_keiji@xxxxxxxxxxxxxxxxxxxx>
in Thu, 27 Jun 2002 09:14:29 +0900 (JST) ...
>
> (a) 最適化を抑制するために volatile を指定するだけでは不十分
>
こちらの方は、少なくとも充分ではありません。
volatile 宣言自体は、本質的には最適化の制御を行うものではなく、
あくまでも、「暗黙のうちに値が変更されている可能性がある」という
情報を付加するだけのものです。
たとえば、
int a, b;
a = b;
a = b;
a = b;
としたときに、a = b; を3度繰り返すのは普通意味がありませんから、
最適化によって、2個目以降の a = b が削除される可能性はあります。
ここで、
int a;
volatile int b;
と宣言すれば、それぞれの場所で b の値が変わる可能性がありますから、
a = b は最適化によらず、3回コード化されると考えられます。
ただし、これは、このコード以降で a が使用される可能性があるときの
みです。
たとえば、
void foo()
{
int a:
volatile int b;
a = b;
a = b;
a = b;
}
という関数があった場合、a に代入された値は使われることがありません。
おまけに、a はローカル変数ですから、この値は単に消えるだけです。
(と言う意味では、volatile な ローカル変数って意味ないですね、失礼)
この場合、最適化によって、「a への代入そのものが無意味」と判断される
可能性があります。この場合、volatile 制限があったとしても、a = b の
代入3個が丸ごとなくなります。
というわけで、votatile 宣言があるからと言って最適化されないとは
限りませんというのは事実です。
--
_/ -- Last 82 hours until 2002 World Cup final (27 Jun @076) ------
_/ FUJIHARA Keiichi
_/ E-Mail : keiichi@xxxxxxxxxxxxx <or> nagi@xxxxxxxxxxxxxxx
_/ URL : http://www.keiichi.fujihara.name/
--------------------------------------------+----- Luna Phase 16.92 --
PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6