月C++コンパイラは最適メンバ変数アクセス
this->m_stop=0;
while(!this->m_stop)
{
// do stuff
}
無限ループに次のループを最適化ループ内のコールが間接的ステータスフラグに影響を与える可能性があるので、この問題は、単一のスレッドコンテキストに関連しています。
月C++コンパイラは最適メンバ変数アクセス
this->m_stop=0;
while(!this->m_stop)
{
// do stuff
}
無限ループに次のループを最適化ループ内のコールが間接的ステータスフラグに影響を与える可能性があるので、この問題は、単一のスレッドコンテキストに関連しています。
ループの本体が合法的m_stop
を変えることができることは可能な方法が存在しない場合、これは許さ最適化です。
コンパイラはループ内の機能の内容を見ることができないなら、それは彼らがm_stop
を変更することができます仮定しなければなりません。 m_stop
または*this
へのポインタや参照がループの本体で実行されるコードにアクセス可能な場所に格納されている場合
、コンパイラは「doesnのm_stop
を仮定しても安全であるかどうかを判断するために、より広範な分析を行う必要がありますt変化。この分析を行うことができない場合、m_stop
を参照する可能性のあるものがループ本体に変更された場合、m_stop
が変更される可能性があります。
this->m_stop
が不揮発性の場合、コンパイラはthis->m_stop
の値が変更されていないことを知ることができます(つまり、条件は常に真となります)。
おそらくそれは(場合によっては)条件がthis->m_stop
が揮発性である場合にも当てはまり残ることを知っている可能性があります。しかし、まだこのシナリオでは、(それが知っている場合でも、結果は0
になります)、それはまだ基本的にループを繰り返しごとに少なくともthis->m_stop
を評価しなければならないことを意味します。通常、コンパイラはそれを知らないでしょう。
this->m_stop
が値を変更する場合も、ループの開始時に値が0
であることをコンパイラが何とか知ることができます。
[std :: memory_order](http://en.cppreference.com/w/cpp/atomic/memory_order)を 'volatile'よりも優れたオプションにしますか? –
@JesperJuhlそれは私が思う目的に依存するでしょう。 'volatile'はintreスレッドの同期化ではなく、むしろスレッド内の操作の順序付けです。揮発性@skyking – skyking
は、他のスレッドのためにそれを使用することが不十分とキーワードの素人の説明になりますM.M @ –
コンパイラは、唯一の整形プログラムの観察可能な動作には影響しません最適化を行うことができます。これは一般にとして知られています。ルールです。それは手紙に標準以下のいくつかの抽象マシンによって実行されたプログラムはかのように、動作する必要がありますが、実装は、それはあまりにも長い間、プログラムが同じように動作するように高速に実行するために実行に関する物事を変更することがあります。
それは、プログラムの観察可能な行動に影響を及ぼさないことを証明できない限り、そのように、コンパイラが無限ループにコードを最適化することはできません。もちろん、どこかで未定義のビヘイビアがある場合、すべてのベットはオフになっています。
はいこれはコンパイラが行う可能性があります。あなたは変数を「volatile」にすることで回避することができます。 –
ない「ものを行う」場合は、 'this->潜在 –
は、一般的にm_stop'変更し、最適化は、標準準拠のプログラムは保証動作の違いを伝えることができない場合に限り、法的です。 –