新聞中心
不知道你是否聽(tīng)說(shuō)過(guò)++i比i++快的說(shuō)法,真的如此嗎?

成都創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、南芬網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為南芬等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
++i與i++的區(qū)別
這兩個(gè)表達(dá)式從我們初學(xué)編程語(yǔ)言的時(shí)候就會(huì)接觸到。前者是自增后取值,后者是取值后自增。
我們看一個(gè)簡(jiǎn)單的例子。
- #include
- using namespace std;
- int main()
- {
- int a = 0;
- int b = 0;
- int c = a++;//int tmp = a;c=a;aa = a + 1
- int d = ++b;//bb = b + 1;d = b;
- cout<<"c="<
- return 0;
- }
運(yùn)行結(jié)果:
- c=0;d=1
對(duì)于這個(gè)結(jié)果我們并不感到意外。
另外我們還注意到另外一個(gè)有意思的現(xiàn)象:
- #include
- using namespace std;
- int main()
- {
- int a = 0;
- int b = 0;
- int *c = &(a++);
- int *d = &(++b);
- return 0;
- }
編譯后報(bào)錯(cuò):
- main.cpp:7:19: error: lvalue required as unary ‘&’ operand
- int *c = &(a++);
說(shuō)&作用于左值,也就是說(shuō)a++的結(jié)果并非左值。但++b的結(jié)果是左值。
可簡(jiǎn)單理解左值和右值:
- 左值,有名對(duì)象,可賦值
- 右值,臨時(shí)對(duì)象,不可被賦值
運(yùn)算符重載
通過(guò)前面的例子也發(fā)現(xiàn)了,對(duì)于內(nèi)置類型,前置自增返回對(duì)象的引用,而后置自增返回對(duì)象的原值(但非左值)。
基于上述原則,一個(gè)前置版本和后置版本的常見(jiàn)實(shí)現(xiàn)如下:
- class Test
- {
- public:
- Test& operator++();//前置自增
- const Test operator++(int);//后置自增
- private:
- int curPos; //當(dāng)前位置
- };
- /*前置自增實(shí)現(xiàn)范式*/
- Test& Test::operator++()
- {
- ++curPos; //自增
- return *this; //取值
- }
- /*后置自增實(shí)現(xiàn)范式,為了與前置區(qū)分開(kāi),多了一個(gè)int參數(shù),但從來(lái)沒(méi)用過(guò)*/
- const Test Test::operator++(int)
- {
- Test tmp = *this; //取值
- ++curPos; //自增
- return tmp;
- }
仔細(xì)觀察后,我們發(fā)現(xiàn)前置自增,先自增,后返回原對(duì)象的對(duì)象;沒(méi)有產(chǎn)生任何臨時(shí)對(duì)象;而后置自增,先保存原對(duì)象,然后自增,最后返回該原臨時(shí)對(duì)象,那么它就需要?jiǎng)?chuàng)建和銷毀,這樣一來(lái),效率孰高孰低就很清楚了。
在不進(jìn)行賦值的情況下,內(nèi)置類型前置和后置自增的匯編都是一樣的呢!
- void test()
- {
- int i = 0;
- i++;
- //++i;
- }
匯編:
- push rbp
- mov rbp, rsp
- mov DWORD PTR [rbp-4], 0
- add DWORD PTR [rbp-4], 1
- nop
- pop rbp
- ret
不過(guò),賦值的情況下,并且不開(kāi)啟編譯器優(yōu)化,它們的匯編代碼還是有差別的,有興趣的可以試試。
總結(jié)
對(duì)于內(nèi)置類型,前置和后置自增或者自減在編譯器優(yōu)化的情況下,兩者并無(wú)多大差別,而對(duì)于自定義類型,如無(wú)特別需要,人們似乎更加偏愛(ài)前置自增或自減,因?yàn)楹笾米栽龀3?huì)產(chǎn)生臨時(shí)對(duì)象。
但是,又能提高多少效率呢?
網(wǎng)站名稱:為什么說(shuō)++i的效率比i++高?
文章來(lái)源:http://m.fisionsoft.com.cn/article/dpjsoio.html


咨詢
建站咨詢
