使用_InterlockedIncrement
时,Visual Studio会生成以下机器代码:
; 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]
代替mov
和xadd
Microsoft是否有正当理由选择xadd
并使用2条指令代替1?
答案 0 :(得分:5)
因为_InterlockedIncrement
也会返回新值。
您无法使用lock inc DWORD PTR [eax]
执行此操作,因为现在找不到旧值和新值。除了在内存中,但如果你进行其他阅读,显然它不会是原子的(增量本身就是,但你可以得到一个与增量时发生的事情无关的值)
返回该值会使_InterlockedIncrement
更有用。