我正在尝试找到T
类型与std::atomic
的比较语义的位置。
我知道除了整数类型的内置专精之外,T
可以是任何TriviallyCopyable
类型。但compare_and_exchange_X
等操作如何知道如何比较 T
的实例?
我想他们必须简单地对用户定义的对象进行逐字节比较(如memcmp
),但我没有看到标准中明确提到的位置。
所以,假设我有:
struct foo
{
std::uint64_t x;
std::uint64_t y;
};
当我致电std::atomic<foo>
时,编译器如何知道如何比较两个std::atomic<foo>::compare_and_exchange_weak()
个实例?
答案 0 :(得分:3)
在草案n3936中,memcmp
语义在第29.6.5节中有明确描述。
注意:例如,atomic_compare_exchange_strong的效果是 if(memcmp(object,expected,sizeof(* object))== 0) memcpy(object,&amp; 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
允许但不保证成功。
答案 1 :(得分:0)
定义了它的实现。它可能只是使用互斥锁,或者它可能在内存blob上使用一些内在函数。标准只是定义它,以便后者可以作为实施策略。
编译器在这里不知道任何事情。它都在图书馆里。由于它是一个模板,您可以阅读您的实施方式。