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