std::atomic_fetch_xxx
(或,和,add,sub,xor)的一组免费函数,将std::atomic<T>*
命名为obj:
template< class T >
T atomic_fetch_sub(std::atomic<T>* obj,
typename std::atomic<T>::difference_type arg ) noexcept;
问题:为什么将std :: atomic类型作为指针而不是作为引用传入,例如:
T atomic_fetch_sub(std::atomic<T>& obj,
typename std::atomic<T>::difference_type arg ) noexcept;
是否存在实际的理性/理性还是仅仅是风格?
答案 0 :(得分:3)
拥有自由函数的整个想法是与C兼容。您可以非常轻松地将C代码导入C ++并使其在那里工作相同(反之亦然)。
如果你不希望你可以使用成员函数 - 使用任何地方的引用 - 例如obj.fetch_sub(arg)
,甚至obj -= arg
使用运算符重载。
但是代码只是C ++。
答案 1 :(得分:2)
为什么std :: atomic_fetch将指针作为其输入参数
atomic_fetch_sub
需要能够更新第一个参数的值(如果失败),这需要第一个参数由指针或引用传递。
选择了一个指针使其与C接口兼容。
答案 2 :(得分:0)
这些自由函数存在,应用程序能够在不改变大部分代码的情况下编译为C或C ++。通过获取指针,调用自由函数看起来像atomic_fetch_add(var, ...)
。这也是C ++中存在atomic_int
的原因,尽管它的定义与C版本不同。
C11使用generic selection macros实现了这种函数重载。 atomic_fetch_add
in C不是一个功能;它是一个宏,根据其中一个参数的类型选择调用哪个函数。