保证编译器指令在C++中重新排序

Guarantee of compiler instruction reorderings in C++

本文关键字:新排序 排序 编译器 指令 C++      更新时间:2023-10-16

给定的是以下函数foo

int x;
void foo()
{
[...]
x = 0x1234;
cv.set();
[...]
}

cv是一个非标准条件变量,由我必须使用的外部 API 提供。C++标准给出的保证,所以我可以肯定,在设置条件变量后永远不会写入x

条件变量当然在内部使用内存围栏,但由于实现在不同的翻译单元中,编译器在编译 foo 期间无法知道这一点。

cv是一个非标准条件变量...哪个保证C++标准

没有。标准不能保证根据定义超出标准范围的东西的行为。如果cv没有(内部(使用C++标准认可的东西,那么标准就不能谈论他们的行为。

因此,您只能获得cv制造商为您提供的保证以及您的实施保证。

话虽如此:

由于实现在不同的翻译单元中,编译器在编译 Foo 期间无法知道这一点。

如果编译器看不到某个函数的实现,编译器如何知道它是在使用C++condition_variable还是 POSIX 或其他东西?甚至没有这些。

不能。编译器无法知道某些函数调用不会调用某些标准定义的同步机制,因此实现必须假定它确实会调用,并避免以可能违反此类机制的方式对指令进行重新排序。