[英]Comparison semantics with std::atomic types
我试图找到定义std::atomic
T
类型比较语义的位置。
我知道除了整数类型的内置专业知识外, 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中,第29.6.5节明确描述了memcmp
语义。
注意:例如,atomic_compare_exchange_strong的作用是:(memcmp(object,Expected,sizeof(* object))== 0)memcpy(object,&desired,sizeof(* object)); 否则memcpy(expected,object,sizeof(* object));
和
注意:如果基础类型具有填充位,陷阱位或相同值的备用表示形式,则比较和交换操作的
memcpy
和memcmp
语义可能会导致与operator==
相等的值的比较失败。
该措辞至少从n3485起就出现了。
请注意,只有memcmp(p1, p2, sizeof(T)) != 0
对compare_and_exchange_weak
(保证失败)有意义。 memcmp(p1, p2, sizeof(T)) == 0
允许但不保证成功。
它的实现已定义。 它可能只是使用互斥锁,也可能是在内存Blob上使用了一些内在函数。 该标准只是对其进行定义,以使后者可以作为实施策略。
编译器在这里什么都不知道。 全部都在图书馆里。 由于它是模板,因此您可以阅读实现的实现方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.