![]() |
1
2
是的,两者都有。 C++内存模型要求原子操作遵循某些语义,这些语义取决于指定的内存排序参数。因此,编译器必须发出代码,这些代码在执行时会根据这些语义进行操作。 例如,采用如下代码:
在典型的机器上,编译器需要:
在绝大多数代码中,内存排序参数被指定为编译时间常数,因为程序员静态地知道需要什么排序,因此编译器可以发出适合该特定排序的指令。
在排序参数不是常量的特殊情况下,无论指定了什么值,编译器都必须发出行为正常的代码。通常情况下,编译器只将排序参数视为
但是,如果编译器确实选择了测试和分支,为了优化周围的代码,它通常必须假设“最坏情况”。例如,在AArch64上,对于
然而,它需要确保
另一方面,它可以想象地发射
但我们现在已经远远超出了实际编译器实际执行的转换范围。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |