将语义与std::原子类型进行比较
Comparison semantics with std::atomic types
我试图找到类型T
与std::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));
和
注意:如果底层类型具有相同值的填充位、陷阱位或替换表示,则比较和交换操作的
memcpy
和memcmp
语义可能会导致与operator==
比较相等的值的比较失败。
这种措辞至少从n3485开始就存在了。
请注意,只有memcmp(p1, p2, sizeof(T)) != 0
对compare_and_exchange_weak
(故障保证)有意义。memcmp(p1, p2, sizeof(T)) == 0
允许但不保证成功。
它是由实现定义的。它可以只是使用互斥锁,也可以对内存块使用一些内部函数。该标准只是对其进行了定义,使后者可以作为一种实施策略。
编译器在这里什么都不知道。这些都将在图书馆里。由于它是一个模板,您可以阅读您的实现是如何做到的。
- 将模板化的类型与C++中的某些类/类型进行比较
- C++中"std::sort"比较器的不同类型
- 比较两个整数在C++中与未知 int 类型的相等性
- 如何使用变量模板比较 C++ 17 中的变量类型?
- 比较LLVM值的类型
- 用于比较基元类型的std::可选的有趣程序集
- 在C++中返回基元类型数组(Java比较)
- 为模板类中的特定类型编写比较器函数
- 为什么比较函数类型需要指定为模板参数?
- C++,"由于数据类型范围有限,比较总是正确的"
- C++ 中的 Java8 lambda 类型比较
- 运算符中的模板类型比较 == 重载
- 分类类型比较
- 具有类型比较的 LLVM 测试示例问题
- C++类型比较:类型 ID 与双重调度dynamic_cast
- Java泛型类型比较
- 运算符< std::map 的 int 类型比较的重载?(我希望它按降序排序。
- 如何在c++中声明带有指针类型比较器的set
- c++类型比较
- 类型比较的Boost静态断言