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 각종 유형의 변수 가 메모리 에 있 는 주소
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.