[H8-ML(2020)] Re: volatile宣言(GCC で検証)
From: FUJIHARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2002年06月27日(木)13時18分06秒
 藤原です。
 基本的には、「最適化」は処理系依存ですが……

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


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


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


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