关于指令重排序有个问题不明白的一个问题多线程
int a = 2; int c = 1 + a; float b = 3f / 2f;
举个栗子,从CPU的设计者以及编译器的设计者角度来看,上面第3行代码彻底能够放到第1行代码以前运行,且不会影响程序的正确性(as-if-serial)。线程
float b = 3f / 2f; 从处理器的角度来看,若是当前处理器在执行第2行代码(CPU处于占用状态),而接下来这第3行代码的运算彻底能够交给FPU(FPU处于空闲状态),那么何乐而不为 先把第3行代码提交给FPU(浮点运算器)去执行呢,反正结果出来以后,并不会影响程序的正确性,并且相比一行一行运行代码,闲置的FPU 提早加入运算工做能够明显减小程序运行的总时间,由于FPU跟CPU能够并行。设计
从多线程的角度来看,下面这行代码就会存疑,由于单线程的as-if-serial 在多线程下运行的时候就会产生意想不到的错误。code
if (b == (3f/2f)){ assert c==3; }