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

如果我要写这篇文章,我会使用 justlock inc DWORD PTR [eax]而不是movandxadd

Microsoft 是否有正当理由首选xadd并使用 2 条指令而不是 1 条指令?

4

1 回答 1

5

因为_InterlockedIncrement也返回新值。

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

返回值会_InterlockedIncrement更有用。

于 2012-07-09T08:33:59.417 回答