2014-11-03 114 views
2

我试图找到类型Tstd::atomic的比较语义的定义。比较语义与std ::原子类型

我知道,除了内置专门的积分类型,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

它不会“比较T的一个实例”。标准中的措辞是它“比较你的对象占用的内存的内容”,意味着对象类型被忽略。 – 2014-11-03 22:54:03

回答

3

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

注意:例如,atomic_compare_exchange_strong的效果是 如果(memcmp(对象,预期,的sizeof(*对象))== 0) 的memcpy(对象,&需要的话,的sizeof(*对象)); else memcpy(expected,object,sizeof(* object));

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

至少自n3485以来至少存在该措词。

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

0

它的实现已定义。它可能只是使用互斥锁,或者它可能使用内存blob上的某些内在函数。该标准简单地定义了它,使后者可以作为实施策略。

编译器在这里什么都不知道。它全都在图书馆里。既然它是一个模板,你可以阅读你的实现如何做。