将语义与std::原子类型进行比较

Comparison semantics with std::atomic types

本文关键字:类型 比较 语义 std      更新时间:2023-10-16

我试图找到类型Tstd::atomic的比较语义的定义位置。

我知道除了内置的积分类型专门化之外,T可以是任何TriviallyCopyable类型。但是像compare_and_exchange_X这样的操作如何比较T的实例呢?

我想他们必须简单地对用户定义的对象(如memcmp)进行逐字节的比较,但我看不出在标准中哪里明确提到了这一点。

所以,假设我有:

struct foo
{
  std::uint64_t x;
  std::uint64_t y;
};

当我调用std::atomic<foo>::compare_and_exchange_weak()时,编译器如何知道如何比较两个std::atomic<foo>实例?

在草案n3936中,memcmp语义在第29.6.5节中有明确描述。

注意:例如,atomic_compare_exchange_strong的效果为if(memcmp(object,应为,sizeof(*object))==0)memcpy(object,&desired,sizeof(*object));其他的memcpy(应为,object,sizeof(*object));

注意:如果底层类型具有相同值的填充位、陷阱位或替换表示,则比较和交换操作的memcpymemcmp语义可能会导致与operator==比较相等的值的比较失败。

这种措辞至少从n3485开始就存在了。

请注意,只有memcmp(p1, p2, sizeof(T)) != 0compare_and_exchange_weak(故障保证)有意义。memcmp(p1, p2, sizeof(T)) == 0允许但不保证成功。

它是由实现定义的。它可以只是使用互斥锁,也可以对内存块使用一些内部函数。该标准只是对其进行了定义,使后者可以作为一种实施策略。

编译器在这里什么都不知道。这些都将在图书馆里。由于它是一个模板,您可以阅读您的实现是如何做到的。