티스토리 뷰

안녕하세요, IT디자이너입니다.

 

이번 포스팅은 저번 포스팅에서 비쥬얼스튜디오 사용시 Debug모드와 Release모드의 차이점을 보충 설명하도록 하겠습니다.!

 

먼저 프로젝트 속성에서 C/C++ 메뉴를 클릭 후 최적화 메뉴에서 "사용 안 함"을 체크를 해주세요.

 

그 이유는 저희가 작성한 소스코드를 컴파일시 컴파일러가 판단하여 몇가지의 소스코드를 생략하는 현상이 발생하게 됩니다. (이 부분은 추후 포스팅에 자세히 설명드리도록 하겠습니다. )

 

저번 포스팅인 "Debug 모드와 Release 모드 디버깅"에서 프로그램의 메모리 구조를 간단히 살펴보았습니다. 

여기서 우리가 자세히 알아볼 부분은 "스택 메모리" 부분입니다. 

 

스택 메모리는 후입선출(last in, first out)의 특징을 가지고 있습니다.  또한 우리가 작성한 지역변수 매개변수는 모두 스택 메모리에 저장되어 사용됩니다. 

 

스택 메모리의 가장 첫번째 위치를 "EBP(Extended Base Pointer)"라는 "레지스터"를 이용하여 저장합니다. 

또한, 다음에 저장될 메모리 위치를 가리키는 레지스터를 "ESP(Extended Stack Pointer)"라고 부릅니다.

 

 

그림에 있는 간단한 소스코드를 체크포인트를 이용하여 Debug모드 컴파일 후 디스어셈블을 창을 열어보았습니다. 

 

main() 함수 코드 이후에 "push ebp" 라는 어셈블리 코드는 esp가 가리키는 메모리 공간에 ebp의 값을 넣는다는 의미입니다. 이 어셈블리 코드의 의도는 ebp 즉, 스택 메모리의 첫 시작 주소를 백업(back up) 하기 위함입니다. 

그리고 esp가 가리키는 메모리 위치를 ebp에 복사합니다. esb가 가리키는 위치는 아래 사진처럼 변경됩니다.

 

 

또한 sub 0C0h는 16진수로 192의 값을 뜻하며 192의 크기만큼 데이터를 push하게 됩니다. 그리고 ebx,esi,edi의 레지스터의 값을 push하여 백업을 하게됩니다. 

 

"lea edi [esb-0C0h]" 는 edi가 가리키는 값을 ebp백업 후 0C0h의 값을 push한 위치를 가리키게 변경하기 위한 코드입니다. 

 

"mov ecx 30h" 코드는 30h의 값인 48을 ecx에 복사하라는 의미입니다. ecx 레지스터는 주로 반복문의 카운터에 주로 사용되는 레지스터입니다. 

 

"mov eax 0cccccccch" eax에 (32bit 기준에서) 레지스터 비트수만큼 c를 채운 값을 복사하라는 의미입니다.

 

"rep stos dword ptr es:[edi]" 코드의 해석은 rep는 반복문 명령어 이며 stos는 저장 이라는 명령어 입니다. 즉,

ecx에 저장된 값만큼 반복하여 eax의 값을 저장하라는 의미가 됩니다. 

 

함수 호출시 최종적으로 스택에 저장된 초기값은 이렇습니다. 

 

이러한 무수한 많은 작업들은 Debug모드에서만 발생되는 부분입니다. 메모리공간을 여유롭게 확보하여 프로그래머가 실수하여 오류가 나는 것을 최대한 예방하려는 차원이지만 이러한 부분 때문에 성능저하가 발생될 수 있습니다. 

 

그리고 0cccccccch로 확보된 부분은 예제로 작성된 코드를 볼 경우 겨우 3개의 int형 변수를 사용하지만 너무 많은 공간이 확보되었습니다. 

 

Release모드로 디버깅시 이부분이 해결됩니다. 

 

Release모드 컴파일

Release모드 컴파일시  Debug모드에서 진행된 안전장치들이 모조리 해제되며 확보되는 메모리 공간도 int형 변수 3개의 크기인 12byte만 확보됩니다.!!! 즉, Debug보다 훨씬 개선된 성능을 보여줄 것입니다.

 

하지만 조금의 실수도 허용되지 않기 때문에 정확한 코딩실력이 필요로 합니다. 

 

실제로 현업에서는 Release모드로 디버깅 후 배포하고있습니다. 즉, Release 모드로 코딩하는 것에 익숙해져야 할것입니다.!!


IT 디자이너였습니다. 감사합니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함