i++ i+=1 i=i+1 汇编代码效率比较

结论:一样。编译器和编译器之间可能有点区别但是程序不会变。


0x00

  一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或者" i += 1 ",

  今日闲来无事,尝试一下。

0x01

  直接的赋值语句。

  编译器:Dev-C++ 5.11

扫描二维码关注公众号,回复: 5887983 查看本文章

  代码:

void asd() {}
int main() {
    int i=0;
    i++;
    asd();  //方便在IDA中区分上下文
    i=i+1;
    asd();
    i+=1;
    return 0;
}

  反汇编:


mov     [rbp+i], 0    //i的初始化
add     [rbp+i], 1    //i++;
call    _Z3asdv         ; asd(void)
add     [rbp+i], 1    //i=i+1;
call    _Z3asdv         ; asd(void)
add     [rbp+i], 1    //i+=1;

  总结:一毛一样。

0x02

  换个编译器

  编译器:Microsoft Visual Studio 2013

  代码:跟上边的一样

  反汇编:  //突然变得裹脚布


mov     [ebp+i], 0      //i的初始化
mov     eax, [ebp+i]    //这三行是i++
add     eax, 1        //先取出i放到eax,加1之后再放回去
mov     [ebp+i], eax
call    sub_41110E      //void asd()
mov     eax, [ebp+i]    //这三行是i=i+1
add     eax, 1
mov     [ebp+i], eax
call    sub_41110E      //void asd()
mov     eax, [ebp+i]    //这三行是i+=1
add     eax, 1
mov     [ebp+i], eax

  总结:一毛一样。

0x03

  换一种语句,用for试试

  编译器:Dev-C++ 5.11

  代码:

void asd() {}
int main() {
    int i;
    for(i=0; i<5; i++) ;
    asd();
    for(i=1; i<6; i++) ;
    asd();
    for(i=2; i<7; i++) ;
    asd();
    return 0;
}

  反汇编:  总而言之还是那个样子。

0x04

  换编译器:Microsoft Visual Studio 2013

  代码:和上边一样

  反汇编:    总而言之还是老样子。

0x05

  还是不太放心

  试试,如果是两个变量呢?

  编译器:Dev-C++ 5.11

  代码:

void asd() {}
int main() {
    int i, j;
    asd();
    i=i+j;
    asd();
    i+=j;
    asd();
    return 0;
}

  反汇编: 

call    _Z3asdv         ; asd(void)
mov     eax, [rbp+var_8]
add     [rbp+var_4], eax
call    _Z3asdv         ; asd(void)
mov     eax, [rbp+var_8]
add     [rbp+var_4], eax
call    _Z3asdv         ; asd(void)

  一样。

0x06

  总结:i++、i=i+1、i+=1, 效果一样。

  i+=j、i=i+j,也是一样的

  但是既然能够少写两个字符,为什么还要多写两个呢?

  况且,用 i += j 的,总是看不起写 i = i + j 的。

猜你喜欢

转载自www.cnblogs.com/iishuu/p/10706580.html
i++