_InterlockedIncrement内部实现

Jak*_*aka 2 x86 assembly visual-studio-2010 intrinsics

使用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
Run Code Online (Sandbox Code Playgroud)

如果我要写这个,我会用lock inc DWORD PTR [eax]而不是movxadd

是否有正当理由支持Microsoft xadd并使用2条指令代替1条指令?

har*_*old 5

因为_InterlockedIncrement还返回新值.

你无法做到这一点lock inc DWORD PTR [eax],因为现在找不到任何旧值和新值.除了在内存中,但是如果你进行其他读取,显然它不会是原子的(增量本身就是,但你可以得到一个与增量时发生的事情无关的值).

返回该值会_InterlockedIncrement更有用.