2012-07-09 62 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