藤原です。 直接の回答にはなってないのですが、 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