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 に答える