gpt4 book ai didi

c++ - C++ 优化中的代码重新排序在什么时候停止?

转载 作者:行者123 更新时间:2023-11-30 02:54:10 25 4
gpt4 key购买 nike

我已经阅读了很多关于优化代码中代码执行保证的 SO 问题,因此我正在尝试编制一份关于允许/阻止编译器重新排序代码序列的原因列表。

我已经从普遍正确的内容开始回答,但我没有添加标准中的引号(这是根据我的经验得出的)。如果有任何遗忘或扩展/更正那里的点,我会要求您添加到提供的答案中。

此外,有人可以为我验证代码块是否不受重新排序的影响。即

void fn()
{
{ /* code block 1 */ ... }
{ /* code block 2 */ ... }
}

代码块 1 中的代码是否有可能混合先于执行代码块 2

最佳答案

该标准为编译器提供了很大的余地来重新排序代码并进行各种其他优化。对优化器的唯一真正约束是执行代码的可观察结果应该“好像”代码是按照程序员编写的顺序执行的。只要遵循“好像”规则,编译器/链接器/CPU/内存子系统就可以自由地重新排序他们喜欢的任何东西。变量上的 volatile 修饰符限制了重新排序(或省略)读取和写入该变量的机会,因为它告诉编译器它不能对从一次读取或写入到另一次的变量状态做出任何假设,但通常它不影响在同一段代码中对其他非 volatile 变量的读写。

C++11 标准添加了额外的语言,明确说明在事情稍微复杂一点的多线程世界中存在哪些保证。在这里,该标准保证了“无数据争用程序的顺序一致性”。如果程序员使用正确的同步并且不编写任何数据竞争,这实际上就是“好像”规则。但是,如果您的代码存在数据竞争,您可能会观察到结果,如果代码是按照您编写的顺序执行的,那么当有多个同时执行线程时,您可能无法观察到这些结果。 C++11 原子和内存屏障提供了一些方法来向编译器表达额外的约束,即在存在多个并发执行线程的情况下可以安全地执行哪些类型的重新排序。

关于c++ - C++ 优化中的代码重新排序在什么时候停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com