我们知道,现代CPU能够同时执行多个命令:https://en.wikipedia.org/wiki/Out-of-order_execution
结果,我们可能会得到如下事实:
当我们执行c ++代码:x = a + b; y = c + d;
时,y = c + d;
可能在x = a + b;
之前执行。
我的问题是是否可以禁用CPU的乱序执行?
答案 0 :(得分:3)
No, you can't deactivate such hardware mechanism when it has it. That's what gives you performance. That's how the CPU is designed.
What C++ guarantees is that you won't be able to see the difference between what you want with the proper order, and what you will get. And that's also something that vendors like Intel will make sure for the assembly.
Have a look at https://www.youtube.com/watch?v=FJIn1YhPJJc&frags=pl%2Cwn for the C++ execution model.
答案 1 :(得分:1)
您只需要关心程序的含义即可。那不是书呆子,它是整个语言设计的基础。
C ++程序描述了程序的含义。它不是源代码到计算机应做的事情的一对一映射。
如果需要的话,您将不得不使用汇编语言或中世纪的一些老式语言进行编码,但是即使那样,您仍然很难告诉现代CPU不要做所有聪明的事情。它旨在支持有用的程序。当然,我不知道有任何现成的开关,标志或设置可以使这种情况发生;这将与CPU的体系结构背道而驰。
最终,您最好构建和编写一个差分引擎;)
答案 2 :(得分:1)
您不能在硬件级别(CPU级别)上取消重新排序。
但是,您可以使用优化级别debug
确保编译器不会重新排序。
这将有助于调试程序,但会使您的代码运行缓慢。在生产代码中不建议这样做。
答案 3 :(得分:-2)
不可能从程序中禁用乱序执行,这是Memory Barrier的众所周知的问题。由于问题的后果仅出现在多线程程序中,因此您必须使用同步原语来确保执行顺序。