代码之家  ›  专栏  ›  技术社区  ›  J Mkdjion

为什么std::atomic\u fetch将指针作为其输入参数

  •  0
  • J Mkdjion  · 技术社区  · 7 年前

    的自由函数集 std::atomic_fetch_xxx (or、and、add、sub、xor) ,作为输入a std::atomic<T>* 命名对象:

    template< class T >
    T atomic_fetch_sub(std::atomic<T>* obj,
                       typename std::atomic<T>::difference_type arg ) noexcept;
    

    问:为什么std::原子类型作为指针而不是作为引用传入,例如:

    T atomic_fetch_sub(std::atomic<T>& obj,
                       typename std::atomic<T>::difference_type arg ) noexcept;
    

    是否有实际的理性/理由,还是仅仅是风格上的?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Bo Persson Touseef    7 年前

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

    如果您不想这样做,可以使用成员函数,例如到处使用引用 obj.fetch_sub(arg) ,甚至 obj -= arg 使用运算符重载。

    但是代码将仅为C++。

        2
  •  2
  •   LWimsey    7 年前

    为什么std::atomic\u fetch将指针作为其输入参数

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

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

        3
  •  0
  •   Nicol Bolas    7 年前

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

    C11通过使用 generic selection macros atomic_fetch_add in C 不是函数;它是一个宏,根据其参数的类型选择要调用的函数。

    推荐文章