2013-10-09 9 views
8

揮発性コピーコンストラクタの使い方を説明するための簡単な、または現実的な例を教えてください。揮発性コピーコンストラクタとは何ですか?

私はちょうど1つを思い付くことができませんでした。

+6

揮発性オブジェクトがある場合は、volatile copy-ctorが必要です。ですから、質問はこれに沸きます:いつあなたは揮発性の物体が必要ですか? – Nawaz

答えて

8

@Nawazは、すでに指摘したように:

をあなたは揮発性のオブジェクトを持っている場合、あなたは揮発性のコピーctorのを必要としています。ですから、質問はこれに沸きます:いつあなたは揮発性の物体が必要ですか?

主に、volatileキーワードを使用する主な理由は、最適化を無効にするためです。それはあなたがこのような何かを持っている場合です。

bool flag = false; 
if(!flag) {} 

コンパイラフラグを毎回チェックする必要はありませんので、そのフラグを変更することはできませんが表示されます - それはしません。しかし、フラグ変数をvolatileにすると、それが実行されます。ここで

は、volatileキーワードの元使用の意見です:link要するに

、それはもともとやや珍しいとすることができる、MMIO経由でハードウェアにアクセスするために使用された:

unsigned char* pControl = 0xff24 ; 
*pControl = 0 ; 
*pControl = 0 ; 
*pControl = 0 ; 

そして、あなたはしないでください最適化のためにそれらの3つの割り当てを1つにしてください。

そして、ここでは揮発性のアンドレイ・アレキの論文は、マルチスレッドのソフトウェアである:link

はアレキの論文を批判し、いくつかの論文がありましたが、私はそれを見つけることができませんでした。彼は揮発性の物などを捨てていたという点がありました。

は、マルチスレッドに非常に重要なことに注意して、@JanHudecが指摘:それは、最適化を防止しながら、それが明示的な障壁を生成しないので、

volatileは、マルチスレッドコンテキストのために全く役に立ちません。そして、1つのCPU上で行われた書き込みが別のCPUに見えなくなることはありません(アーキテクチャに依存します; x86には一貫性のあるキャッシュがあるため、書き込みは常にそこに表示されます)。

volatileまた、操作をアトミックにすることはありません。 x86の割り当ては常にアトミックですが、すべてのCPUアーキテクチャではそうではありません。増分などのより複雑な操作は、std::atomicを使用してのみアトミックにすることができます。

+0

意見はありません、有効なパーマリンクを使用してみてください。 – Zeta

+0

@Zeta - ありがとう。 URLがどうにか乱れてしまった。編集されました。 –

+3

'volatile'はマルチスレッドのコンテキストでは全く役に立たないのですが、最適化を妨げる一方、明示的な障壁を生成しないからです。そして、1つのCPU上で行われた書き込みが別のCPUに見えなくなることはありません(アーキテクチャに依存します; x86には一貫性のあるキャッシュがあるため、書き込みは常にそこに表示されます)。 –

関連する問題