i + + 와 + i 연구

더 읽 기
직접 코드 올 리 기:
1.++i
int add(int a, int b)
{
  int c = 0;
  b = ++c;
  return a+b;
}

int init()
{
  int a = add(3, 4);
  return a;
}

 대응 하 는 어 셈 블 리 는 다음 과 같다.
 
_Z3addii:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$16, %esp
	movl	$0, -8(%ebp)
	addl	$1, -8(%ebp)
	movl	-8(%ebp), %eax
	movl	%eax, -4(%ebp)
	movl	-4(%ebp), %eax
	movl	8(%ebp), %edx
	addl	%edx, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	_Z3addii, .-_Z3addii
	.globl	_Z4initv
	.type	_Z4initv, @function

 
다음 몇 마디 를 중점적으로 분석 하 자.
movl $0, -8(%ebp)  ;이 문장 은 c = 0 addl $1, - 8 (% ebp) 을 나타 낸다.이 문장 은 + + c movl - 8 (% ebp),% eax 를 나타 낸다.이 문장 은 c 가 추가 한 값 을 임시 레지스터 에 movl% eax, - 4 (% ebp) 로 저장 합 니 다.이 문장 은 c 가 추 가 된 값 을 b 에 게 부여 하 는 것 을 나타 낸다
 
2.i++
int add(int a, int b)
{
  int c = 0;
  b = c++;
  return a+b;
}

int init()
{
  int a = add(3, 4);
  return a;
}

 대응 하 는 어 셈 블 리 는 다음 과 같다.
_Z3addii:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$16, %esp
	movl	$0, -8(%ebp)
	movl	-8(%ebp), %eax
	movl	%eax, -4(%ebp)
	addl	$1, -8(%ebp)
	movl	-4(%ebp), %eax
	movl	8(%ebp), %edx
	addl	%edx, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	_Z3addii, .-_Z3addii
	.globl	_Z4initv
	.type	_Z4initv, @function

 다음 몇 마디 를 중점적으로 보 세 요.
movl $0, -8(%ebp) ;이 문장 은 c = 0 movl - 8 (% ebp),% eax 를 나타 낸다.이 문장 은 c 의 값 을 임시 레지스터 에 movl% eax, - 4 (% ebp) 로 표시 합 니 다.이 문장 은 c 가 추가 되 지 않 은 값 을 b addl $1, - 8 (% ebp) 에 부여 하 는 것 을 나타 낸다.이 문장 은 c 의 값 을 1 로 더 하 는 것 을 나타 낸다.
결론: + + i 는 먼저 추가 한 다음 에 추가 한 값 을 사용 하고 i + + 는 원래 의 값 을 먼저 사용 한 다음 에 추가 합 니 다.

좋은 웹페이지 즐겨찾기