2012-07-09 60 views
2

Visual Studio的产生当使用_InterlockedIncrement以下的机器代码:_InterlockedIncrement内在实施

; 40 :  _InterlockedIncrement(&framecounter); 

    00078 b8 00 00 00 00 mov  eax, OFFSET [email protected]@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]代替movxadd

是否有正当的理由为什么微软首选xadd并使用2条指令而不是1?

回答

5

因为_InterlockedIncrement也返回新的值。

你不能这样做与lock inc DWORD PTR [eax],因为现在既不是旧的也不是新的价值被发现。除了在内存中,但如果你做了其他的阅读,显然它不会是原子的(增量本身会是,但你可以得到一个与增量时发生的事情无关的值)。

返回值使得_InterlockedIncrement更有用。

+0

你是对的......现在,在我已经写入了更多的代码之后,当我将“framecounter”与其他东西进行比较时,我对我的inc有了一种令人毛骨悚然的感觉:) – Jaka 2012-07-09 09:45:38