纯小白,上次jd面试官问我,在使用效果相同的情况下,i++和++i哪个更好,我没答上来,后来反问面试官,面试官跟我说i++要多一步拷贝,我觉得确实有道理,回宿舍写了个代码想测试一下
int N = 8;
int a = N--;
N = 8;
int b = --N;
编译完看了下汇编代码,确实多了一行,单步调试终于搞懂了每行的含义
40155d: c7 45 fc 08 00 00 00 movl $0x8,-0x4(%rbp) //N = 8
401564: 8b 45 fc mov -0x4(%rbp),%eax //$eax = N
401567: 8d 50 ff lea -0x1(%rax),%edx //$edx = $rax - 1
40156a: 89 55 fc mov %edx,-0x4(%rbp) //N = $edx
40156d: 89 45 f8 mov %eax,-0x8(%rbp) //a = $eax
401570: c7 45 fc 08 00 00 00 movl $0x8,-0x4(%rbp) //N = 8
401577: 83 6d fc 01 subl $0x1,-0x4(%rbp) //N -= 1
40157b: 8b 45 fc mov -0x4(%rbp),%eax //$eax = N
40157e: 89 45 f4 mov %eax,-0xc(%rbp) //b = $eax
可是问题来了,这部分的编译结果为啥不能是这样呢
movl $8, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, -8(%rbp)
subl $1, -4(%rbp)
movl $8, -4(%rbp)
subl $1, -4(%rbp)
movl -4(%rbp), %eax
movl %eax, -12(%rbp)
这样两种写法在性能上不就一样了吗