c++中i++和++i區別

++i的效率高些,++i在運算過程中不產生臨時對象,返回的就是i,是個左值,類似++i=1這樣的表達式是合法的,而i++在運算的過程中會產生臨時對象,返回的是零時對象的值,是個右值,像i++=1這樣的表達式是非法的
對於內置類型,單獨的i++和++i語句,現在的編譯器基本上都會優化成++i,所以就沒什麼區別了

源代碼

void test1(){
    int i = 0;
    cout << i++ << endl;
}

void test2(){
    int i = 0;
    cout << ++i << endl;
}

反彙編代碼,只截取一段

; cout << ++i << endl;
100000dd6:      8b 45 ec        movl    -20(%rbp), %eax
100000dd9:      83 c0 01        addl    $1, %eax
100000ddc:      89 45 ec        movl    %eax, -20(%rbp)
100000ddf:      89 c6   movl    %eax, %esi
100000de1:      e8 88 00 00 00  callq   136
100000de6:      48 8d 3d c3 fe ff ff    leaq    -317(%rip), %rdi
100000ded:      48 89 45 f8     movq    %rax, -8(%rbp)
100000df1:      48 89 7d f0     movq    %rdi, -16(%rbp)
100000df5:      48 8b 7d f8     movq    -8(%rbp), %rdi

 

; cout << i++ << endl;
100000c76:      8b 45 ec        movl    -20(%rbp), %eax
100000c79:      89 c1   movl    %eax, %ecx
100000c7b:      83 c1 01        addl    $1, %ecx
100000c7e:      89 4d ec        movl    %ecx, -20(%rbp)
100000c81:      89 c6   movl    %eax, %esi
100000c83:      e8 e6 01 00 00  callq   486
100000c88:      48 8d 3d 21 00 00 00    leaq    33(%rip), %rdi
100000c8f:      48 89 45 f8     movq    %rax, -8(%rbp)
100000c93:      48 89 7d f0     movq    %rdi, -16(%rbp)
100000c97:      48 8b 7d f8     movq    -8(%rbp), %rdi

發現i++多了一步 100000c79:      89 c1   movl    %eax, %ecx,
++i則是直接吧累加器的值加1,i++則是計數器加1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章