++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/
轉載于:https://blog.51cto.com/jogging/1623163
總結
以上是生活随笔為你收集整理的++i和i++效率谁高的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用jQuery卸载绑定的事件
- 下一篇: 敏捷开发流程总结