C++ 0x | 为什么std :: atomic使用volatile-qualifier重载每个方法?

0xb*_*00d 7 c++ qualifiers volatile member-functions c++11

当前草案的以下摘录显示了我的意思:

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;
}
Run Code Online (Sandbox Code Playgroud)

易失性是传递性的.因此,您无法从易失性对象中调用非易失性成员函数.另一方面,允许从非易失性对象调用volatile成员函数.

那么,原子类中的volatile和非volatile成员函数之间是否存在任何实现差异?换句话说,是否需要非易失性过载?

tem*_*def 4

我认为挥发性重载的存在是出于效率原因。在 C++0x 中,易失性读写本质上比非易失性读写更昂贵,因为内存模型提出了一些严格的要求,阻止缓存易失性变量的值。如果所有函数仅被标记为易失性,那么代码不一定能够进行某些可以提高性能的优化。具有这种区别允许编译器在可能的情况下优化非易失性读取和写入,同时在需要易失性读取和写入时优雅地降级。

  • @FrEEzE2046-在 C++0x 中,“易失性”的定义更加严格,并且实际上不仅仅意味着“不优化”。此外,成员函数上 volatile 修饰符的更准确含义是“this”指针是“易失性”,因此函数中发生的对成员变量的任何访问都将隐式变为易失性 (4认同)