在一些特定的使用中, i++
可能将原值用中间量存起来以待使用,下面看相关程序的汇编代码(使用 gcc
)。
i++
源程序:
#include <stdio.h>
int main(){
int i = 1;
printf("%d\n", i++);
return 0;
}
i++
汇编:
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $1, -4(%rbp) //将i赋值为1.
movl -4(%rbp), %eax //将i的原值转移到中间变量
leal 1(%rax), %edx //将%edx赋值为i+1
movl %edx, -4(%rbp)//i的值改变
movl %eax, %esi //对原来i的值进行打印操作
leaq .LC0(%rip), %rax
movq %rax, %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
再来看相同操作 ++i
++i
的源程序:
#include <stdio.h>
int main(){
int i = 1;
printf("%d\n", ++i);
}
++i
汇编:
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $1, -4(%rbp) //对i进行赋值。
addl $1, -4(%rbp) //i的值加一。
movl -4(%rbp), %eax //对i的值进行打印操作。
movl %eax, %esi
leaq .LC0(%rip), %rax
movq %rax, %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
标签:细微差别,movl,cfi,++,rbp,eax,cfa,效率
From: https://www.cnblogs.com/eehaofu/p/18423208