为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作进行重排序,但是如果操作之间不存在数据依赖关系,那么就有可能被进行重排序。例如:
1 double pi = 3.14 ; //A 2 double r = 1.0 ; //B 3 double area = pi * r *r ; //C
上面代码中,C依赖A,C依赖B,所以编译器不会重排序将C排在A,B之前。但是A,B之间没有依赖,所以可能被进行重排序,最终的执行顺序有两种:
A->B->C;
B->A->C;
这两种执行顺序对最终结果不会造成影响。
因为存在重排序,所以单线程程序不一定按照程序的顺序来执行。
该文主要讲述了一些偏概念的东西,先有一些印象,后续会以代码示例的形式进行全面的复习。