[H8-ML(2018)] volatile 宣言(Re: 最適化の抑制(SHC V7で酷い目に))
From: FUJIHARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2002年06月27日(木)10時25分56秒
 藤原です。
 直接の回答にはなってないのですが、

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


スレッド概略
[1992(R)](起点)
 └[2017(U)]
   └[表示中]
     └[2019(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]