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:就目前而言,所有运算符都对 volatile 和 non-volatileother参数进行了重载。我认为这是必要的,以避免对非易失性实例进行较慢的易失性访问?是否有替代方法允许每种方法只编码两次(易失性 lhs 和非易失性 lhs)而不是 4 次(易失性和非易失性 lhs,每个都有易失性和非易失性 rhs)?

我希望将这些问题放在一起是可以的,否则请发表评论,我可以将它们分开。谢谢!

4

2 回答 2

3

该类具有多个单一类型的复制构造函数。此警告是信息性的;构造函数可以在您的程序中调用。

来自 msdn 网站:编译器警告(级别 3)C4521

于 2012-12-14T19:48:04.453 回答
2

Volatile 不会像您认为的那样做

即使使用 VC++ 的特殊、非标准volatile行为,它也会导致代码比正确编写代码更慢。使用std::atomic,或者如果它不可用,那么您可能已经获得了特定于平台的屏障、栅栏和原子内在函数。VC++ 具有帮助您的功能_ReadWriteBarrier_Interlocked

于 2012-12-14T19:54:49.867 回答