2

Visual Studio を_InterlockedIncrement使用すると、次のマシン コードが生成されます。

; 40   :        _InterlockedIncrement(&framecounter);

  00078 b8 00 00 00 00   mov     eax, OFFSET ?framecounter@@3JA ; framecounter
  0007d b9 01 00 00 00   mov     ecx, 1
  00082 f0 0f c1 08  lock     xadd   DWORD PTR [eax], ecx

私がこれを書くなら、lock inc DWORD PTR [eax]代わりにmovandを使用しますxadd

xaddMicrosoftが 1 つではなく 2 つの命令を優先して使用する正当な理由はありますか?

4

1 に答える 1

5

_InterlockedIncrement新しい値も返すためです。

lock inc DWORD PTR [eax]古い値も新しい値もどこにも見つからないため、 でそれを行うことはできません。メモリ内を除きますが、他の読み取りを行う場合、明らかにアトミックではありません (インクリメント自体はアトミックになりますが、インクリメント時に発生したこととは関係のない値が返される可能性があります)。

値を返すと、_InterlockedIncrementより便利になります。

于 2012-07-09T08:33:59.417 に答える