编译器和CPU重新排序

时间:2011-03-09 15:50:37

标签: c++ winapi compiler-optimization memory-barriers

我有以下情况。

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()函数的行?

1 个答案:

答案 0 :(得分:3)

编译器永远不会重新排序对外部库中函数的调用。如果你的编译器将这些函数实现为内在函数,那么它就足够聪明,不会重新排序它们。

就CPU重新排序而言,the MSDN documentation表示“此函数会生成一个完整的内存屏障(或栅栏),以确保按顺序完成内存操作。”