天天看點

++i和i++效率誰高

2014屆搜狗校招筆試題再次提到了這個經典的問題,去百度上查資料解答是:

(1):++i是在i上直接加1,表達式的值是i本身

i++也是在i上加1,表達式的值是加1前的副本

因為要存副本,是以效率略低,但是實際上大部分編譯器都會完成這部分優化工作,但是對于自定義的疊代器之類的,就未必有優化了

(2):如果i是内置類型的,如int,效率是一樣的(沒有拷貝構造函數)。

如果是非内置類型的。如自定義類型a:

a& a::operator++();//++a

const a a::operator++(int);//a++,傳回對象,調用拷貝構造函數

是以++a效率更高些。

(3):c++primer上面有說:對于老舊的編譯器++i效率好,對于好的編譯器i++被優化了(效率一樣)。表示該用哪個用哪個。

(4):1、當變量i的資料類型是c++語言預設提供的類型的話,他們的效率是一樣的。

int a,i=0; a=++i;彙編代碼如下: int a,i=0; 01221a4e mov dword ptr [i],0 a=++i;

01221a55 mov eax,dword ptr [i] 01221a58 add eax,1 01221a5b mov dword ptr

[i],eax 01221a5e mov ecx,dword ptr [i] 01221a61 mov dword ptr [a],ecx

int a,i=0; a=i++;彙編代碼如下: int a,i=0; 009e1a4e mov dword ptr [i],0 a=i++;

009e1a55 mov eax,dword ptr [i] 009e1a58 mov dword ptr [a],eax 009e1a5b

mov ecx,dword ptr [i] 009e1a5e add ecx,1 009e1a61 mov dword ptr [i],ecx

從彙編代碼可以看出,他們的執行行數是一樣的!

2、我們自定的資料類型,++i效率高于i++,通過運算符重載來給大家說明這一點。

operator operator::operator++() { ++value; //内部成員變量 return *this; }

operator operator::operator++(int) { operator temp; temp.value=value;

value++; return temp; }

看到了嗎?後++必須要有一個臨時對象才可以完成。是以他的效率自然就下降了!

(4)解答是個人感覺是最靠譜的答案,就是在某種情況下(自定義類型),++i的效率确實高于i++;

原文連結:http://www.cplusplus.me/1303.html

出自:http://www.douban.com/note/317754047/