天天看點

為什麼說++i比i++效率高?

作者:守望之名  來源CSDN(點選閱讀全文前往):

不知道你是否聽說過++i比i++快的說法,真的如此嗎?

這兩個表達式從我們初學程式設計語言的時候就會接觸到。前者是自增後取值,後者是取值後自增。

我們看一個簡單的例子。

運作結果:

對于這個結果我們并不感到意外。

另外我們還注意到另外一個有意思的現象:

編譯後報錯:

說&作用于左值,也就是說a++的結果并非左值。但++b的結果是。

可簡單了解左值和右值:

左值,有名對象,可指派

右值,臨時對象,不可被指派

在《運算符重載》一文中已經說到了運算符的重載,通過前面的例子也發現了,對于内置類型,前置自增傳回對象的引用,而後置自增傳回對象的原值(但非左值)。

基于上述原則,一個前置版本和後置版本的常見實作如下:

仔細觀察後,我們發現前置自增,先自增,後傳回原對象的對象;沒有産生任何臨時對象;而後置自增,先儲存原對象,然後自增,最後傳回該原臨時對象,那麼它就需要建立和銷毀,這樣一來,效率孰高孰低就很清楚了。

在不進行指派的情況下,内置類型前置和後置自增的彙編都是一樣的呢!

彙編:

不過,指派的情況下,并且不開啟編譯器優化,它們的彙編代碼還是有差别的,有興趣的可以試試。

對于内置類型,前置和後置自增或者自減在編譯器優化的情況下,兩者并無多大差别,而對于自定義類型,如無特别需要,人們似乎更加偏愛前置自增或自減,因為後置自增常常會産生臨時對象。

為什麼說++i比i++效率高?