保证编译器指令在C++中重新排序
Guarantee of compiler instruction reorderings in C++
给定的是以下函数foo
int x;
void foo()
{
[...]
x = 0x1234;
cv.set();
[...]
}
cv
是一个非标准条件变量,由我必须使用的外部 API 提供。C++标准给出的保证,所以我可以肯定,在设置条件变量后永远不会写入x
。
条件变量当然在内部使用内存围栏,但由于实现在不同的翻译单元中,编译器在编译 foo 期间无法知道这一点。
cv
是一个非标准条件变量...哪个保证C++标准
没有。标准不能保证根据定义超出标准范围的东西的行为。如果cv
没有(内部(使用C++标准认可的东西,那么标准就不能谈论他们的行为。
因此,您只能获得cv
制造商为您提供的保证以及您的实施保证。
话虽如此:
由于实现在不同的翻译单元中,编译器在编译 Foo 期间无法知道这一点。
如果编译器看不到某个函数的实现,编译器如何知道它是在使用C++condition_variable
还是 POSIX 或其他东西?甚至没有这些。
不能。编译器无法知道某些函数调用不会调用某些标准定义的同步机制,因此实现必须假定它确实会调用,并避免以可能违反此类机制的方式对指令进行重新排序。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 数组将排序排序为降序而不是升序
- 如何按姓氏排序并打印新数组
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- 如何对骰子进行排序并创建每个数组中具有相等骰子的新数组,Yahtzee,C++
- 与排序相关的算法(将每个项目替换为排序排序中的索引)
- 如何将未排序数组的排序索引放入新数组中
- "std::"具有排序/排序、存在测试和头/尾访问的数据结构?
- 创建没有重复项的新排序向量
- 使用快速排序排序不会给出排序的数组
- 读取文本行,对它们进行排序并将它们写入新的文本文件