作者:守望之名 來源CSDN(點選閱讀全文前往):
不知道你是否聽說過++i比i++快的說法,真的如此嗎?
這兩個表達式從我們初學程式設計語言的時候就會接觸到。前者是自增後取值,後者是取值後自增。
我們看一個簡單的例子。
運作結果:
對于這個結果我們并不感到意外。
另外我們還注意到另外一個有意思的現象:
編譯後報錯:
說&作用于左值,也就是說a++的結果并非左值。但++b的結果是。
可簡單了解左值和右值:
左值,有名對象,可指派
右值,臨時對象,不可被指派
在《運算符重載》一文中已經說到了運算符的重載,通過前面的例子也發現了,對于内置類型,前置自增傳回對象的引用,而後置自增傳回對象的原值(但非左值)。
基于上述原則,一個前置版本和後置版本的常見實作如下:
仔細觀察後,我們發現前置自增,先自增,後傳回原對象的對象;沒有産生任何臨時對象;而後置自增,先儲存原對象,然後自增,最後傳回該原臨時對象,那麼它就需要建立和銷毀,這樣一來,效率孰高孰低就很清楚了。
在不進行指派的情況下,内置類型前置和後置自增的彙編都是一樣的呢!
彙編:
不過,指派的情況下,并且不開啟編譯器優化,它們的彙編代碼還是有差别的,有興趣的可以試試。
對于内置類型,前置和後置自增或者自減在編譯器優化的情況下,兩者并無多大差别,而對于自定義類型,如無特别需要,人們似乎更加偏愛前置自增或自減,因為後置自增常常會産生臨時對象。
