0

std::atomic_fetch_xxx (or, and, 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;

有实际的理性/原因还是只是风格?

4

3 回答 3

3

拥有自由函数的整个想法是与 C 兼容。您可以很容易地将 C 代码导入 C++ 并使其在那里工作相同(反之亦然)。

如果您不希望这样,您可以使用成员函数——例如在任何地方使用引用——obj.fetch_sub(arg)甚至obj -= arg使用运算符重载。

但随后代码将仅是 C++。

于 2018-04-28T07:47:21.317 回答
2

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

atomic_fetch_sub需要能够更新第一个参数的值(以防它失败),这需要通过指针或引用传递第一个参数。

选择了一个指针以使其与 C 接口兼容。

于 2018-04-28T02:27:42.110 回答
0

这些免费函数的存在使应用程序能够编译为 C 或 C++,而无需更改大部分代码。通过获取指针,调用 free 函数看起来像atomic_fetch_add(var, ...). 这也是atomic_int存在于 C++ 中的原因,尽管它的定义与 C 版本不同。

C11 通过使用泛型选择宏来实现这种函数重载。atomic_fetch_add在 C中不是函数;它是一个宏,它根据其中一个参数的类型选择要调用的函数。

于 2018-04-28T02:51:17.827 回答