面試題 1 i 是否原子操作?並解釋為什麼?

2021-06-20 14:15:22 字數 602 閱讀 8888

不是原子操作。理由:

1.i++分為三個階段:

記憶體到暫存器

暫存器自增

寫回記憶體

這三個階段中間都可以被中斷分離開.

2.++i首先要看編譯器是怎麼編譯的

某些編譯器比如vc在非優化版本中會編譯為以下彙編**:

__asm

這種情況下,必定不是原子操作,不加鎖互斥是不行的。

假設加了優化引數,那麼是否一定會編譯為「inc dword ptr[i]」呢?答案是否定的,這要看編譯器心情,如果++i的結果還要被使用的話,那麼一定不會被編譯為「inc dword ptr[i]」的形式。

那麼假設如果編譯成了「inc dword ptr[i]」,這是原子操作,是否就不需要加鎖了呢?如果在單核機器上,不加鎖不會有問題,但到了多核機器上,這個不加鎖同樣會帶來嚴重後果,兩個cpu可以同時執行inc指令,但是兩個執行以後,卻可能出現只自加了一次。

真正可以確保不「額外」加鎖的彙編指令是「lock inc dword ptr[i]」,lock字首可以暫時鎖住匯流排,這時候其他cpu是無法訪問相應資料的。但是目前沒有任何乙個編譯器會將++int編譯為這種形式。

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...

面試題 i 和 i哪個效率更高

include int main 簡單地比較字首自增運算子和字尾自增運算子的效率是片面的,因為存在很多因素影響這個問題的答案。考慮內建資料型別的時候,它們的效率差別不大 去除編譯器的影響 考慮自定義資料型別 主要是指類 的情況。此時我們不需要再做很多彙編 的分析,因為字首式 i 可以返回物件的引用,...

微軟面試題 1

題 編寫反轉字串的程式,要求優化速度 優化空間。分析 構建兩個迭代器p 和 q 在一次遍歷中,p的位置從字串開頭向中間前進,q從字串末尾向中間後退,反轉字串只要每次遍歷都交換p和q所指向的內容即可,直到p和q在中間相遇,這時迴圈次數剛好等於 字串的長度 2。實現 view plain author ...