我有以下情况。
volatile double val1 = 10.0;
volatile double val2 = 20.0;
double SetValues(double d1, double d2)
{
double ret = d1-d2;
InterlockedExchange64( (volatile long long*)&val1, *((long long*)&d1) ); // val1 = d1;
InterlockedExchange64( (volatile long long*)&val2, *((long long*)&d2) ); // val2 = d2;
return val1 - va2;
}
我的问题是,是否有可能CPU或编译器重新排序SetValues()
函数的行?
答案 0 :(得分:3)
编译器永远不会重新排序对外部库中函数的调用。如果你的编译器将这些函数实现为内在函数,那么它就足够聪明,不会重新排序它们。
就CPU重新排序而言,the MSDN documentation表示“此函数会生成一个完整的内存屏障(或栅栏),以确保按顺序完成内存操作。”