首页
社区
课程
招聘
[原创](小白)C/C++汇编角度浅析i++和++i的区别
发表于: 2020-9-16 18:38 4515

[原创](小白)C/C++汇编角度浅析i++和++i的区别

2020-9-16 18:38
4515

编写代码
main.cpp:

运行结果:

Alt + 8 反汇编调试发现:

int b = ++a 是a先自增1之后再赋值给b,而 int d = c++ 则是先把c的值给d后c再自增,所以d的值为0,经过测试,函数返回时也会发生这个问题:

单行测试 i++ 和 ++i

反汇编代码:

发现汇编代码一样,说明单行使用++运算符时不影响赋值。

在类相关的地方使用(例如:迭代器),会产生效率问题

重载++运算符

STL vector迭代器:

迭代中,使用++运算符,只是为了让迭代器内置的指针+1而已,并不需要指针移动之前迭代器的副本,所以使用前置++会比后置++更加节省内存。换言之,复杂的循环中使用前置++会提高效率。

int main(void)
{
    int a = 0;
    int b = ++a;
 
    int c = 0;
    int d = c++;
 
    return 0;
}
int main(void)
{
    int a = 0;
    int b = ++a;
 
    int c = 0;
    int d = c++;
 
    return 0;
}
a = 1
b = 1
c = 1
d = 0
a = 1
b = 1
c = 1
d = 0
//int a = 0;
0132139E  mov         dword ptr [a],0 
//int b = ++a;
013213A5  mov         eax,dword ptr [a] 
013213A8  add         eax,1 //这里有区别 
013213AB  mov         dword ptr [a],eax 
013213AE  mov         ecx,dword ptr [a] 
013213B1  mov         dword ptr [b],ecx 
 
//int c = 0;
013213B4  mov         dword ptr [c],0 
//int d = c++;
013213BB  mov         eax,dword ptr [c]
013213BE  mov         dword ptr [d],eax //这里有区别  
013213C1  mov         ecx,dword ptr [c] 
013213C4  add         ecx,1 
013213C7  mov         dword ptr [c],ecx
//int a = 0;
0132139E  mov         dword ptr [a],0 
//int b = ++a;
013213A5  mov         eax,dword ptr [a] 
013213A8  add         eax,1 //这里有区别 
013213AB  mov         dword ptr [a],eax 
013213AE  mov         ecx,dword ptr [a] 
013213B1  mov         dword ptr [b],ecx 
 
//int c = 0;
013213B4  mov         dword ptr [c],0 
//int d = c++;
013213BB  mov         eax,dword ptr [c]
013213BE  mov         dword ptr [d],eax //这里有区别  
013213C1  mov         ecx,dword ptr [c] 
013213C4  add         ecx,1 
013213C7  mov         dword ptr [c],ecx
return i++;//此时函数返回i自增前的值
 
return ++i//此时返回i自增后的值
return i++;//此时函数返回i自增前的值
 
return ++i//此时返回i自增后的值
int i = 0;
i++;
int j = 0;
++j;
int i = 0;
i++;
int j = 0;
++j;
//int i = 0;
0015139E  mov         dword ptr [i],0 
//i++;
001513A5  mov         eax,dword ptr [i] 
001513A8  add         eax,1 
001513AB  mov         dword ptr [i],eax 
 
//int j = 0;
001513AE  mov         dword ptr [j],0 
//++j;
001513B5  mov         eax,dword ptr [j] 
001513B8  add         eax,1 
001513BB  mov         dword ptr [j],eax
//int i = 0;
0015139E  mov         dword ptr [i],0 
//i++;
001513A5  mov         eax,dword ptr [i] 
001513A8  add         eax,1 
001513AB  mov         dword ptr [i],eax 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-9-16 18:40 被Jmsrwt编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//