根据上一篇文章https://vinci-897.github.io/volatile-in-cpp/中memory order部分提到的内容,我们知道,不同的cpu有不同的memory model和memory order,这导致cpu会对代码进行重排序,虽然单线程上编译器和cpu对代码的重排序都不会导致最终结果的不同,但当代码在一个cpu核心上执行时,由于多核缓存不同步等问题,其他的cpu核心会看到与原有代码顺序不同的访存顺序,这就是我们所说的乱序执行,这会引起一些问题。
编译期重排序已经在上一篇文章中描述过,因此本文中,我们所说的都是cpu内存模型导致的指令重排序。我认为,编译器的优化行为是从单线程角度考虑的,重排时会保证单线程逻辑不变,而cpu乱序执行。对于单核cpu内部看来访存顺序也是不会改变的,仅仅是对其他cpu核心来说访存行为的顺序改变。