zoukankan      html  css  js  c++  java
  • C++ | 调试 · 从汇编代码看i++和++i的区别

    以int类型为例
    C++编译器为++i生成的代码是
    013E1375  mov        eax,dword ptr [i] 
    013E1378  add         eax,1 
    013E137B  mov        dword ptr [i],eax
    很简单,基本不用分析
    第一行是把i的值放到eax中,然后调用add对eax进行+1,最后将eax再放到i中
    再看看i++
    0119137E  mov        eax,dword ptr [i] 
    01191381  add         eax,1 
    01191384  mov        dword ptr [i],eax 
    结果是完全一样,
     
    下面再看看有赋值的情况
    int c = ++i;
    012D1384  mov        eax,dword ptr [i] 
    012D1387  add         eax,1 
    012D138A  mov        dword ptr [i],eax 
    012D138D  mov        ecx,dword ptr [i] 
    012D1390  mov        dword ptr [c],ecx 
    可以看到这个操作在完成了前三部之后做了两个mov把最终的i值放到了c中
     
    再看看
    int b = i++;
    012D1375  mov        eax,dword ptr [i] 
    012D1378  mov        dword ptr [b],eax 
    012D137B  mov        ecx,dword ptr [i] 
    012D137E  add        ecx,1 
    012D1381  mov        dword ptr [i],ecx 
    结果稍有不同,在把i的值mov到eax之后又立即把eax放到了b中,随后的三步保持与之前一致只不过寄存器换成了ecx,正好符合i++的特性

    未来CTO关注我CTO之路从此开始微信号:wlaicto

  • 相关阅读:
    Uva1595 对称轴
    Uva712 S树
    Uva673 平衡的括号
    leetcode102 二叉树的层次遍历
    Uva10191 复合词
    C++ multimap的用法
    Uva1103 古代象形符号
    UVa10763 交换学生
    C++ 优先级队列 priority_queue
    ios,zepto穿透解决方案
  • 原文地址:https://www.cnblogs.com/JiesonWu/p/5536655.html
Copyright © 2011-2022 走看看