3

我有以下这种情况。

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

4

1 回答 1

3

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

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

于 2011-03-09T16:27:35.187 回答