333 단어
2 분
++i vs i++ 어셈블리 비교 메모

전위 증가 (++i) vs 후위 증가 (i++)#

후위 증가는 임시 변수가 필요해 전위 증가보다 느리다고 하는데, 어셈블리 레벨에서 확인해보자.

  • 환경: MSVC (Visual Studio) x64 C++ 컴파일러 기준
전위증가#
mov         eax,dword ptr [b]                   ; eax = b
inc         eax                                 ; eax++
mov         dword ptr [b],eax                   ; b = eax
mov         eax,dword ptr [b]                   ; eax = b
mov         dword ptr [d],eax                   ; d = eax
후위증가#
mov         eax,dword ptr [a]                   ; eax = a
mov         dword ptr [rbp+134h],eax            ; ! temp = a
mov         eax,dword ptr [a]                   ; eax = a
inc         eax                                 ; eax++
mov         dword ptr [a],eax                   ; a = eax
mov         eax,dword ptr [rbp+134h]            ; ! eax = temp
mov         dword ptr [c],eax                   ; c = eax
  • 후위연산은 임시로 base pointer + 0x134 (+308byte) 떨어진 곳에 a를 저장(mov)
  • 다시 불러오는(mov) 과정이 추가
  • 결론적으로 mov연산이 2회 추가

코드 전문#

	int a = 1;
00007FF650F8DF8C  mov         dword ptr [a],1  
	int b = 1;
00007FF650F8DF93  mov         dword ptr [b],1  

	a++;
00007FF650F8DF9A  mov         eax,dword ptr [a]  
00007FF650F8DF9D  inc         eax  
00007FF650F8DF9F  mov         dword ptr [a],eax  
	++b;
00007FF650F8DFA2  mov         eax,dword ptr [b]  
00007FF650F8DFA5  inc         eax  
00007FF650F8DFA7  mov         dword ptr [b],eax  

	int c = a++;   // 후위 증가
00007FF650F8DFAA  mov         eax,dword ptr [a]  
00007FF650F8DFAD  mov         dword ptr [rbp+134h],eax  
00007FF650F8DFB3  mov         eax,dword ptr [a]  
00007FF650F8DFB6  inc         eax  
00007FF650F8DFB8  mov         dword ptr [a],eax  
00007FF650F8DFBB  mov         eax,dword ptr [rbp+134h]  
00007FF650F8DFC1  mov         dword ptr [c],eax  
	int d = ++b;   // 전위 증가
00007FF650F8DFC4  mov         eax,dword ptr [b]  
00007FF650F8DFC7  inc         eax  
00007FF650F8DFC9  mov         dword ptr [b],eax  
00007FF650F8DFCC  mov         eax,dword ptr [b]  
00007FF650F8DFCF  mov         dword ptr [d],eax