3

揮発性インスタンスと非揮発性インスタンスの両方をサポートする必要があるクラスを作成しています (揮発性インスタンスはアトミック操作を使用し、非揮発性インスタンスは通常の操作を使用します)、正しい方法でそれを行っているかどうか疑問に思っています。これまでのクラス宣言の抜粋を次に示します。

class Yield {
public:
    Yield();
    Yield(Yield const &other);
    Yield(Yield const volatile &other);

    Yield &operator=(Yield const &other);
    Yield &operator=(Yield const volatile &other);

    Yield &operator+=(Yield const &other);
    Yield &operator+=(Yield const volatile &other);
    Yield volatile &operator+=(Yield const &other) volatile;
    Yield volatile &operator+=(Yield const volatile &other) volatile;

    // Other operators snipped...
};
  • 質問 1: MSVC でコンパイルすると、次の警告が表示されます。

    warning C4521: 'util::Yield' : multiple copy constructors specified

    この警告は、このクラスを使用する際の問題の前兆ですか? それとも、安全に無視できますか?

  • 質問 2: 現状では、揮発性引数と非揮発性other引数の両方ですべての演算子がオーバーロードされています。不揮発性インスタンスの揮発性アクセスが遅くなるのを避けるために、これが必要だと思いますか? 各メソッドを 4 回 (揮発性および不揮発性 lhs、それぞれ揮発性および不揮発性 rhs を持つ) ではなく 2 回 (揮発性 lhs および不揮発性 lhs) だけコーディングできるようにする代替手段はありますか?

これらの質問をまとめて問題ないことを願っています。それ以外の場合は、コメントを残してください。分割できます。ありがとう!

4

2 に答える 2

3

クラスには、単一の型の複数のコピー コンストラクターがあります。この警告は情報提供を目的としています。コンストラクターはプログラムで呼び出すことができます。

msdn Web サイトから:コンパイラの警告 (レベル 3) C4521

于 2012-12-14T19:48:04.453 に答える
2

揮発性は、あなたが思っていることをしません

VC++ の特殊な非標準のvolatile動作を使用しても、コードを適切に記述するよりも遅くなります。を使用するstd::atomicか、それが利用できない場合は、おそらくプラットフォーム固有のバリア、フェンス、およびアトミック組み込み関数を使用しています。VC++ には_ReadWriteBarrier_Interlocked役立つ機能があります。

于 2012-12-14T19:54:49.867 に答える