【问题标题】:Why is std::atomic_ref not implemented in terms of std::atomic为什么 std::atomic_ref 没有根据 std::atomic 实现
【发布时间】:2018-11-17 23:17:39
【问题描述】:

P0019r8 论文中引用的 std::atomic_ref 实现大致将模板类型保留为成员变量 (https://github.com/ORNL/cpp-proposals-pub/blob/master/P0019/atomic_ref.hpp),并使用 GNU 内置函数来实现原子操作。

我的问题是 - 为什么不将 reinterpret_cast 改为 std::atomic 并使用原子操作呢?是否存在我遗漏的可移植性问题或细节?

【问题讨论】:

    标签: c++ atomic c++20


    【解决方案1】:

    无法保证std::atomic<T> 只包含T,并且与T 具有相同的大小和对齐要求。例如,如果sizeof(T) == 3std::atomic<T> 的实现可能会将其填充到 4 个字节以启用内部函数的使用。再举一个例子,如果 sizeof(T) 对于内部函数来说太大了,std::atomic<T> 可能会存储某种同步原语来序列化操作。

    因此,reinterpret_caststd::atomic 在一般情况下不是可行的实现,即使您忽略对象模型违规的一般未定义行为。

    【讨论】:

      【解决方案2】:

      将某些东西重新解释为它不是的东西然后使用它是未定义的行为。

      【讨论】:

      • 他们将其重新解释为可能与实现中的模板类型不同的类型 - github.com/ORNL/cpp-proposals-pub/blob/master/P0019/…
      • @Curious C++ 的实现 不必是可移植的。它可以使用UB来实现标准库,只要它总是选择生成正确的程序。
      • @curious 还有一些别名魔法标记。我不知道他们做了什么,但他们可能允许别名为不同的原始类型或其他东西。它们超出了 C++ 标准。
      猜你喜欢
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2017-10-27
      • 1970-01-01
      • 2018-12-31
      • 2020-12-03
      相关资源
      最近更新 更多