为什么std :: atomic_fetch将指针作为其输入参数

时间:2018-04-28 02:14:09

标签: c++ pass-by-reference atomic pass-by-pointer

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;

是否存在实际的理性/理性还是仅仅是风格?

3 个答案:

答案 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不是一个功能;它是一个宏,根据其中一个参数的类型选择调用哪个函数。