C++ 为易失性和非易失性实例重载类
我正在编写一个类,它需要同时支持易失性实例和非易失性实例(易失性实例使用原子操作,非易失性实例使用常规操作),我想知道我是否以正确的方式进行操作。以下是迄今为止对类声明的简要介绍:C++ 为易失性和非易失性实例重载类,c++,overloading,volatile,C++,Overloading,Volatile,我正在编写一个类,它需要同时支持易失性实例和非易失性实例(易失性实例使用原子操作,非易失性实例使用常规操作),我想知道我是否以正确的方式进行操作。以下是迄今为止对类声明的简要介绍: class Yield { public: Yield(); Yield(Yield const &other); Yield(Yield const volatile &other); Yield &operator=(Yield const &ot
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编译时,我收到以下警告:
此警告是否预示在使用此类时会出现任何问题?还是可以安全地忽略它警告C4521:'util::Yield':指定了多个副本构造函数
- 问题2:目前,对于volatile和non-volatile
参数,所有运算符都重载。我假设这是必要的,以避免对非易失性实例进行较慢的易失性访问?是否有替代方案允许每个方法只编码两次(易失性lhs和非易失性lhs),而不是4次(易失性和非易失性lhs,每个方法都有易失性和非易失性rhs)other
即使使用VC++的特殊、非标准的
volatile
行为,它也会导致比正确编写代码更慢的代码。使用std::atomic
,或者如果这不可用,那么您可能有特定于平台的屏障、围栏和原子本质。VC++有\u读写载体
和\u互锁
功能来帮助您。我编辑了您的答案,以提供我认为您想要回答他的问题的部分。下一次,最好提供能够回答问题的部分,而不仅仅是链接到一个网站。是的,我知道volatile不会自动提供安全的多线程,我只想用它来区分需要原子操作(实例共享时)和不需要原子操作(实例仅在本地使用)。不必多次复制代码会很好,但到目前为止,其他变体(例如使用模板)甚至更糟糕。volatile
不提供任何多线程功能,也不提供任何原子性。考虑把你的函数命名为原子或类似的东西,而不是使用<代码>易失性< /代码>代码> ,这样人们阅读你的代码就能知道它所做的事情。