为什么std :: atomic会使用volatile来重载每个方法
以下摘自当前的草案显示了我的意思:
namespace std {
typedef struct atomic_bool {
bool is_lock_free() const volatile;
bool is_lock_free() const;
void store(bool, memory_order = memory_order_seq_cst) volatile;
void store(bool, memory_order = memory_order_seq_cst);
bool load(memory_order = memory_order_seq_cst) const volatile;
bool load(memory_order = memory_order_seq_cst) const;
operator bool() const volatile;
operator bool() const;
bool exchange(bool, memory_order = memory_order_seq_cst) volatile;
bool exchange(bool, memory_order = memory_order_seq_cst);
bool compare_exchange_weak(bool&, bool, memory_order, memory_order) volatile;
bool compare_exchange_weak(bool&, bool, memory_order, memory_order);
bool compare_exchange_strong(bool&, bool, memory_order, memory_order) volatile;
bool compare_exchange_strong(bool&, bool, memory_order, memory_order);
bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst) volatile;
bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst);
bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst) volatile;
bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst);
atomic_bool() = default;
constexpr atomic_bool(bool);
atomic_bool(const atomic_bool&) = delete;
atomic_bool& operator=(const atomic_bool&) = delete;
atomic_bool& operator=(const atomic_bool&) volatile = delete;
bool operator=(bool) volatile;
} atomic_bool;
}
挥发性是传递性的。 因此,您不能从易失性对象中调用非易失性成员函数。 另一方面,允许从非易失性对象调用易失性成员函数。
那么,原子类中的volatile和non-volatile成员函数是否存在实现差异? 换句话说,是否需要非易失性过载?
我认为出于效率原因存在易失性过载。 由于内存模型提出了一些严格的要求,以防止缓存volatile变量的值,所以易失性读取和写入比C ++ 0x中的非易失性读取和写入本身更昂贵。 如果所有功能都只标记为易失性,那么代码不一定会进行某些优化,否则会提高性能。 区分允许编译器在可能的情况下优化非易失性读取和写入,同时在需要易失性读取和写入时优雅地降级。
首先,做一个易变的std :: atomic是多余的。 其实,我可以想象一个有用的情况。 假设我们有一个固定的设备(内存)地址,我们想要操作。 由于std :: atomic_xxx类以及std :: atomic <>模板类的大小应该与它们相应的内置类型的大小相同,因此您可能需要同时处理以下操作:使用控制执行原子操作内存排序并确保对我们的原子对象的访问永远不会被优化。 因此,我们可以声明如下内容:
std::atomic<long> volatile* vmem_first4 = reinterpret_cast<std::atomic<long> volatile*>(0xxB8000);
链接地址: http://www.djcxy.com/p/4577.html
上一篇: Why std::atomic overloads each method with the volatile
下一篇: need design/pattern/structure help on coding up a java 'world'