2017-03-20 5 views
0

月C++コンパイラは最適メンバ変数アクセス

this->m_stop=0; 
while(!this->m_stop) 
    { 
// do stuff 
    } 

無限ループに次のループを最適化ループ内のコールが間接的ステータスフラグに影響を与える可能性があるので、この問題は、単一のスレッドコンテキストに関連しています。

+0

はいこれはコンパイラが行う可能性があります。あなたは変数を「volatile」にすることで回避することができます。 –

+3

ない「ものを行う」場合は、 'this->潜在 –

+0

は、一般的にm_stop'変更し、最適化は、標準準拠のプログラムは保証動作の違いを伝えることができない場合に限り、法的です。 –

答えて

1

ループの本体が合法的m_stopを変えることができることは可能な方法が存在しない場合、これは許さ最適化です。

コンパイラはループ内の機能の内容を見ることができないなら、それは彼らがm_stopを変更することができます仮定しなければなりません。 m_stopまたは*thisへのポインタや参照がループの本体で実行されるコードにアクセス可能な場所に格納されている場合

、コンパイラは「doesnのm_stopを仮定しても安全であるかどうかを判断するために、より広範な分析を行う必要がありますt変化。この分析を行うことができない場合、m_stopを参照する可能性のあるものがループ本体に変更された場合、m_stopが変更される可能性があります。

-1

this->m_stopが不揮発性の場合、コンパイラはthis->m_stopの値が変更されていないことを知ることができます(つまり、条件は常に真となります)。

おそらくそれは(場合によっては)条件がthis->m_stopが揮発性である場合にも当てはまり残ることを知っている可能性があります。しかし、まだこのシナリオでは、(それが知っている場合でも、結果は0になります)、それはまだ基本的にループを繰り返しごとに少なくともthis->m_stopを評価しなければならないことを意味します。通常、コンパイラはそれを知らないでしょう。

this->m_stopが値を変更する場合も、ループの開始時に値が0であることをコンパイラが何とか知ることができます。

+0

[std :: memory_order](http://en.cppreference.com/w/cpp/atomic/memory_order)を 'volatile'よりも優れたオプションにしますか? –

+0

@JesperJuhlそれは私が思う目的に依存するでしょう。 'volatile'はintreスレッドの同期化ではなく、むしろスレッド内の操作の順序付けです。揮発性@skyking – skyking

+2

は、他のスレッドのためにそれを使用することが不十分とキーワードの素人の説明になりますM.M @ –

1

コンパイラは、唯一の整形プログラムの観察可能な動作には影響しません最適化を行うことができます。これは一般にとして知られています。ルールです。それは手紙に標準以下のいくつかの抽象マシンによって実行されたプログラムかのように、動作する必要がありますが、実装は、それはあまりにも長い間、プログラムが同じように動作するように高速に実行するために実行に関する物事を変更することがあります。

それは、プログラムの観察可能な行動に影響を及ぼさないことを証明できない限り、そのように、コンパイラが無限ループにコードを最適化することはできません。もちろん、どこかで未定義のビヘイビアがある場合、すべてのベットはオフになっています。

関連する問題