C++메모리 영역 도 얘 기 하고.

알다 시 피 C++메모리 구역 은 스 택,더미,자유 저장 구역,전역/정적 저장 구역,상수 저장 구역 으로 나 뉜 다.
    스 택 은 컴 파일 러 에 의 해 제어 되 고 스 택 공간의 신청,사용 과 방출 은 컴 파일 러 에 의 해 처리 된다.여기 서'전권 처리'는 책임 귀속 을 의미 하 며 컴 파일 러 가 프로그램 이 실 행 될 때 관리 에 개입 하 는 것 은 아니다.실제로 컴 파일 러 의 작업 은 컴 파일 기간 에 완성 되 었 고 스 택 에 대한 관 리 는 컴 파일 할 때 레지스터 esp 에 대한 유지 에 나타난다.
    더미 즉 프로그래머 가 new 와 delete 연산 자 를 사용 하여 관리 하 는 메모리 영역 입 니 다.더미 에 대한 방문 이 창고 보다 느 린 이 유 는 창고 가 시스템 에 의 해 실현 되 고 하드웨어 부품 의 장점 이 있 기 때문이다.한편,더 미 는 C++언어의 데이터 구조 일 뿐 순수한 소프트웨어 이 고 더 미 를 방문 하 는 변 수 는 보통 스 택 의 참여 가 있어 야 완성 할 수 있 습 니 다.
    자유 저장 소 라 는 개념 에 대해 논란 이 있 는데,논란 의 초점 은 그것 이 더미 와 같은 것 인지 아 닌 지 에 있다.자유 저장 소 도 프로그래머 가 관리 하지만 malloc 와 free 작업 을 사용 합 니 다.사실은 자유 저장 소 와 더 미 는 차이 가 있 습 니 다.한편,관리 방법 이 다 릅 니 다.malloc 와 free 는 함수 이 고 new 와 delete 는 C+연산 자 입 니 다.다른 한편,malloc 는 공간 개척 만 책임 지고 반환 지침 은 빈 형식 지침 void*입 니 다.new 는 공간 을 개척 할 뿐만 아니 라 대상 구조 함수 도 호출 합 니 다.유사 한 것 은 free 는 공간 만 방출 하고 delete 는 대상 분석 함수 도 호출 합 니 다.
    전역/정적 저장 소 는 이름 그대로 전역 변수 와 정적 변수의 집중 지 입 니 다."전역"전역 변수의 전역 작용 역 에 착안;"정적'은 static 변수의 생명주기 에 착안한다.전 자 는 이해 하기 쉬 우 나 후 자 는 조금 이해 하기 어렵다.사실 C++중의 움직임 과 정적 은 흔히 대상 의 생명주기 라 는 각도 에서 정 해진 다.변수 에 있어'동적'변 수 는 메모리 영역 에서 드 나 드 는 변수 입 니 다.그들의 생명 은 자신의 역할 영역 에 만 국한 되 고 자신의 역할 영역 에서 벗 어 나 면 메모리 에서 지 워 집 니 다.동적 변수 가 사용 하 는 메모리 영역 은 프로그램 실행 과정 에서 방출 될 수 있 습 니 다."정적'의 변 수 는 다 릅 니 다.가장 큰 특징 은 프로그램 에 따라 생 겨 나 고 프로그램 이 죽 으 면 걸음 이 일치 합 니 다.프로그램 이 시작 하면 정적 변 수 는 정적 저장 소 에 자신의 공간 을 가지 고 프로그램 이 실행 되 는 과정 에서 풀 려 나 지 않 으 며 프로그램 이 끝 날 때 만 풀 려 납 니 다.이 를 통 해 알 수 있 듯 이 정적 저장 소 는 변수의 생명 길이 가 프로그램 과 일치 하 는 것 을 강조 한다.
    상수 저장 소 도 상수 저장 소 를 쉽게 이해 할 수 있다.주의해 야 할 것 은 글자 숫자 가 이 영역 에 저장 되 지 않 고 상수 저장 소 에 저 장 된 것 은 보통 상수 문자열 입 니 다.같은 상수 문자열 은 상수 저장 소 에 복사 본 만 보관 하기 때문에 아래 의 이 예 결 과 는 T 로 쉽게 이해 할 수 있 습 니 다.
const char* st1="Astring";
const char* st2="Astring";
cout<<(st1==st2?‘T’:‘F’);
    전역/정적 저장 소 는 기본적으로 0x 00 으로 초기 화 된 영역 이기 때문에 전역/정적 변수 가 초기 화 되 지 않 으 면 기본 값 을 0 으로 설정 합 니 다.상수 저장 소 는 읽 기 전용 영역 으로 프로그램 이 그 어떠한 bit 도 삭제 할 수 없습니다.
    다음은 간단 한 예 로 더 설명 한다.예 코드 는 mregions.cpp 와 같 습 니 다.
/*++ mregions.cpp
 * Purpose:             
 * Created:2011-08-19
 * Author:btwsmile
 --*/
int a=30;
void main()
{
	//a,b,c    
	static int b=10;
	static int c=20;
	int d=40;
	//   
	const char* str1="Astring";
	const char* str2="Newstring";
	// 
	int* p=new int[3];
	p[0]=a;
	p[1]=b;
	p[2]=c;
	delete []p;
}

변수 a 는 전역 변수 이 고 b 와 c 는 정적 변수 이 며 전역/정적 저장 소 에 저 장 됩 니 다."Astring"과"Newstring"은 상수 문자열 로 상수 저장 소 에 저 장 됩 니 다.new int[3]는 더미 위 에 3 개의 정형 데 이 터 를 수용 할 수 있 는 공간 을 열 었 고 delete[]p 는 쌓 인 공간 을 방출 했다.스 택 은 특별한 예 가 없습니다.프로그램 이 곳곳에 스 택 을 사용 하기 때 문 입 니 다.
다음은 mregion.cpp 에 대응 하 는 Disassembly 를 보고 중요 한 부분 을 다음 과 같이 캡 처 합 니 다.
     9: 	//a,b,c    
    10: 	static int b=10;
    11: 	static int c=20;
    12: 	int d=40;
001913AE  mov         dword ptr [d],28h  
    13: 	//   
    14: 	const char* str1="Astring";
001913B5  mov         dword ptr [str1],offset string "Astring" (195748h)  
    15: 	const char* str2="Newstring";
001913BC  mov         dword ptr [str2],offset string "Newstring" (19573Ch)  
    16: 	// 
    17: 	int* p=new int[3];
001913C3  push        0Ch  
001913C5  call        operator new (191177h)  
001913CA  add         esp,4  
001913CD  mov         dword ptr [ebp-104h],eax  
001913D3  mov         eax,dword ptr [ebp-104h]  
001913D9  mov         dword ptr [p],eax  
    18: 	p[0]=a;
001913DC  mov         eax,dword ptr [p]  
001913DF  mov         ecx,dword ptr [a (197000h)]  
001913E5  mov         dword ptr [eax],ecx  
    19: 	p[1]=b;
001913E7  mov         eax,dword ptr [p]  
001913EA  mov         ecx,dword ptr [b (197004h)]  
001913F0  mov         dword ptr [eax+4],ecx  
    20: 	p[2]=c;
001913F3  mov         eax,dword ptr [p]  
001913F6  mov         ecx,dword ptr [c (197008h)]  
001913FC  mov         dword ptr [eax+8],ecx  
    21: 	delete []p;
001913FF  mov         eax,dword ptr [p]  
00191402  mov         dword ptr [ebp-0F8h],eax  
00191408  mov         ecx,dword ptr [ebp-0F8h]  
0019140E  push        ecx  
0019140F  call        operator delete (191082h)  
00191414  add         esp,4  

줄 번호 18-20 이라는 세 문장 에 대응 하 는 반 환 인 코딩 을 주의 하 십시오.변수 a/b/c 가 각각 대응 하 는 메모리 주 소 는 ds:197000 h/197004 h/197008 h 입 니 다.이것 은 각각 전역/정적 데이터 구역 에서 차지 하 는 메모리 공간 주소 입 니 다.14,15 줄 코드 에 대응 하 는 반 환 코드 를 관찰 하면'Astring'과'Newstring'이 각각 상수 저장 소 에 있 는 주 소 는 195748 h/19573 Ch 인 것 을 발견 할 수 있다.17 줄 코드 에 대응 하 는 반 환 코드 에서 new 가 얻 은 첫 번 째 주 소 를 볼 수 없 지만 vs 2010 에서 마 우 스 를 eax 에 멈 추 게 하면 eax 의 값 은 00101 ae0h 입 니 다.스 택 의 주 소 는 레지스터 esp 를 기준 으로 유동 합 니 다.최종 생 성 된 실행 가능 한 파일 에 서 는 변수 이름 a,b,c,str 가 보이 지 않 습 니 다.컴 파일 할 때 만 변 경 된 주 소 를 esp 로 표시 합 니 다.
각종 데이터 메모리 주소 가 있 는 구간 에 주의 하 십시오.서로 다른 유형의 변 수 는 서로 다른 구간 에 있 고 같은 유형의 변 수 는 같은 구간 에 있 으 며 주소 가 연속 되 어 있 습 니 다.그들의 주 소 는 표 1 에 귀납 되 었 다.
                  표 1 각종 유형의 변수 가 메모리 에 있 는 주소

좋은 웹페이지 즐겨찾기