Visual studio 2010 _联锁增量内在实现
当使用Visual studio 2010 _联锁增量内在实现,visual-studio-2010,assembly,x86,intrinsics,Visual Studio 2010,Assembly,X86,Intrinsics,当使用\u 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
\u 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条指令是否有正当理由?因为\u InterlockedIncrement
也会返回新值
使用lock inc DWORD PTR[eax]
无法做到这一点,因为现在无论是旧值还是新值都找不到了。除了在内存中,但是如果你进行另一次读取,显然它不会是原子的(增量本身会是原子的,但是你可以得到一个与增量时发生的事情无关的值)
返回值会使联锁增量更有用。你说得对。。。现在,在我已经编写的代码中添加了更多的代码之后,当我将“framecounter”与Cometing else进行比较时,我对我的inc有一种令人毛骨悚然的感觉:)