-
-
[原创](小白)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编辑
,原因:
赞赏
看原图
赞赏
雪币:
留言: