2011-11-23 11 views
5

私がリリースと最適化でコードVSで非常に単純なケースでもvolatile varsが最適化されないのはなぜですか?

int main() 
{ 
    int i; 
    i = 1; 
    i = 2; 
} 

をコンパイルする場合、分解は次のようになります。

int main() 
{ 
    int i; 
    i = 1; 
    i = 2; 
} 
010D1000 xor   eax,eax 
010D1002 ret 

が、私は言葉 "揮発性" を書き込む場合:

int main() 
{ 
01261000 push  ecx 
    volatile int i; 
    i = 1; 
01261001 mov   dword ptr [esp],1 
    i = 2; 
01261008 mov   dword ptr [esp],2 
} 
0126100F xor   eax,eax 
01261011 pop   ecx 
01261012 ret 

を誰がVSがこのコードを残すのか知っていますか?そこから副作用はありますか? これはプログラム内の唯一のコードなので、なぜオプティマイザはそれを放棄できないのですか?

+23

"私はXをするように言った。それはなぜXをするのか?" – delnan

+6

+1は、うまく構築された、アルビートの誤った質問です。 –

+0

ローカルの非静的変数volatileを宣言するのは無意味なので、この状況を最適化するためには、(MSVC)開発者にとって価値がないと思います。 –

答えて

11

thisリファレンス・ページから:

揮発性 - オブジェクトは、コンパイラによって検出されていない手段によって変更することができ、したがって、いくつかのコンパイラの最適化を無効にする必要があります。

4

volatile修飾子は、変数がコンパイル中のプログラムの制御の外で変更されたり読み取られたりする可能性があることを意味します。最適化するものはありません。

8

揮発性のバースを最適化することができれば、それはその目的を破るだろうか? varにvolatileを付けることは、コンパイラには知らないことをコンパイラに伝えることです。この変数には、プログラムの範囲外で何かが起きている可能性があります。コンパイラがそれを最適化すれば、それらの計画を損なうでしょう。

5

まあvolatileは、変数がコンパイラには見えない方法でアクセス/変更できることをコンパイラに伝えているからです。通常、組み込みソフトウェアで使用され、ハードウェア割り込みなどによって変数の値が変更されます。

2

iがアドインボード上のレジスタにマップされていると、コンパイラがその内容を前提とすることは非常に悪いことです。

i = 1; 
i = 2; 

これは、ハードウェアにコマンドを発行している可能性があります。コマンド '1'をスキップするとかなり悪い結果が得られます。

関連する問題