0

次のインライン メソッドがあり、他のメソッドで数回呼び出します。O2 最適化を備えた vc および gcc コンパイラは、値が呼び出し元のメソッドで固定され、一度だけ評価されることに気付くことができますか? indexAndFlag--これらのメソッド内ではIndeedは変更されません。-- それとも、スレッドセーフのために、呼び出しごとに評価されるのでしょうか?

unsigned int indexAndFlag;
...

inline Index* index() const
{
    return (Index*)(indexAndFlag & ~1);
}

コードはプロテクト モード x86 32/64 ビット アーキテクチャ専用ですsizeof(unsigned int) == sizeof(Index*)。そうでない場合は、私を修正してください。

4

2 に答える 2

2

一番下から始めるとsizeof(unsigned int) != sizeof(Index *)、64ビットでは、それは確かです。そして、その仮定をしている場合はstatic_assert(sizeof(unsigned int) == sizeof(Index *))、コードのどこかで a を使用することをお勧めします。

次に、コンパイラがグローバル変数と最適化に関して何をするかしないかは、間違いなく「コンパイラ次第」の場合です。コンパイラは、毎回値を再ロードすることを決定するか、「ああ、これは変わらないことを知っている」と決定する可能性があります。indexAndFlagそれは、変化していないことをどれだけ「理解」するかにかかっています。

私は個人的に次のようなものを使用します:

 Index* temp = index();

  ... 
   use temp
  ...

次に、インデックスを「計算」するために余分な操作が行われないことが保証されます。

于 2013-09-19T11:19:34.297 に答える