2016-11-29 27 views
1

常用的經驗法則是在不立即評估值的情況下,優先在STL迭代器上使用預增量(即您只想增加對象/迭代器)。這是因爲通常前增量的實現比後增量更有效。pre-increment vs post-increment on std ::原子<int>

但是std :: atomic呢?如果我運行靜態分析(使用PVS studio),我會收到一個警告,說預增量應該更有效率,但是當我查看預增量的實現(在Visual Studio 2015上)時,它看起來效率低於後增量?

是否存在對STL原子值進行後增量時使用預增量的一般規則,還是它會與實現相關?

+3

「看起來效率低於後期增量?」它看起來效率如何*效率較低*? – user2079303

回答

1

效率(在此級別)是總是具體實現。例如,作爲一個經驗法則「優先考慮STL迭代器的預增量」,事實證明,在實踐中,很少有編譯器會爲前增量和後增量生成不同的代碼。 (在後增的虛假副本只是被優化掉不了了之。)

+0

如果虛假副本經過優化,生成的後增量代碼與前增量有什麼不同?編輯:啊,你的意思是生成的代碼是不同的。我誤解了。 – user2079303

+0

@ user2079303:沒有。這是我的觀點。 'it ++;'和'++ it'通常會生成相同的代碼。 (當然,如果你使用增量的結果,那麼代碼顯然會不同。) –

2

我沒有訪問Windows的權利,但在海灣合作委員會,所不同的是

之間
__atomic_fetch_add(&_M_i, 1, memory_order_seq_cst); 

__atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); 

這是內置的,所以你可以假設編譯器知道如何優化它。

,如果你不使用的結果,gcc的-O3產生

lock add  DWORD PTR [rdi], 1 

兩個。

如果你使用的結果,那麼GCC -O3產量

mov  DWORD PTR [rsp-24], edi 
    mov  eax, 1 
    lock xadd  DWORD PTR [rsp-24], eax 
    add  eax, 1 
    ret 

的預增量,並且省略了add eax, 1爲後遞增,所以在技術上,是的,前增量效率較低逐個增加,但實際上,這是由順序存儲器訪問所淹沒的。

TLDR:不用擔心它