티스토리 뷰

메모리 구조

프로그램 실행시 운영체제는 해당 프로그램을 위한 메모리 공간(지역, 전역 변수 선언 등)을 할당

 

 

 

코드(Code)

  • 코드 영역은 프로그래머가 작성한 소스코드가 들어 가는 부분이다.
  • 실행할 프로그램의 코드가 저장되는 영역으로 텍스트 영역으로도 불린다.
  • 실행 파일은 코드 영역에 구성된 명령어들로 메모리 영역에 함수, 제어문, 상수 등을 지정시킨다.

 

데이터(Data)

  • 전역 변수 및 static변수 할당 영역
  • 프로그램 시작시 할당, 종료 후 메모리에서 소멸
#include <stdio.h>

int a = 10; // 데이터 영역에 할당
int b = 20; // 데이터 영역에 할당

int main() {
	static int c = 30; // 데이터 영역에 할당
	return 0;
}

 

힙(Heap)

  • 프로그래머가 직접 할당하는 영역, 필요에 의해 동적 메모리 할당
    • 고수준 언어의 경우 가비지 컬렉터가 자동으로 관리하는 영역
  • 할당해야 할 메모리의 크기를 프로그램이 실행되는 동안(런 타임때) 결정해야 하는 경우 사용되는 공간
    • 보통 스택 영역보다 큰 메모리를 할당받아 사용
  • 메모리의 낮은 주소부터 높은 주소 방향으로 할당

장점

  • 변수는 전역적으로 엑세스 할 수 있다.
  • 메모리 크기 제한이 없다.

단점

  • 상대적 느린 엑세스 (할당/해제가 느림)
  • 메모리 관리가 필요 (변수 할당/해제 책임)
  • 운영체제마다 메모리 관리 체계가 다름
int main() {
	// 정상적인 배열선언
	int arr[10]; // 메모리 40바이트

	// 비 정상적인 배열선언
	int i = 10; // 4바이트

	scanf("%d", &i);
	int arr[i]; // 메모리 4바이트

	return 0;
}
  • 상수를 사용한 정상적 배열 선언은 컴파일때 메모리를 할당 받는다.
  • 'i = 10'이라 선언되어도 컴파일러는 초기화를 무시하기 때문에 4바이트로 인식한다.
  • 위와 같은 이유로 지역변수는 런타임때 크기가 결정되기에 메모리크기를 알수 없다. 단, 선언된 자료형의 크기만 알 수 있다.

 

스택(Stack)

  • 정적 메모리 할당 영역
  • 함수 호출시 생성되는 지역, 매개 변수 할당 영역
  • 함수 호출 완료 후 소멸
  • 스택 영역에 저장되는 함수의 호출 정보는 스택 프레임(stack frame)에 저장
  • 메모리의 높은 주소에서 낮은 주소 방향으로 할당

장점

  • 매우 빠른 액세스 (할당/해제 빠름)
  • 변수를 명시적으로 할당/해제 할 필요가 없음

단점

  • 메모리 크기 제한
  • 지역 변수에만 적용
#include <stdio.h>

void fct1(int);
void fct2(int);

int a = 10;	// 데이터 영역에 할당
int b = 20;	// 데이터 영역에 할당

int main() {

	int i = 100;	// 지역변수 i가 스택 영역에 할당

	fct1(i);
	fct2(i);

	return 0;
}

void fct1(int c) {
	int d = 30;	// 매개변수 c와 지역변수 d가 스택영역에 할당
}

void fct2(int e) {
	int f = 40;	// 매개변수 e와 지역변수 f가 스택영역에 할당
}
  • main의 지역변수 i가 스택영역에 할당
  • fct1함수 호출에 지역변수 d가 스택영역에 할당
  • fct2함수 호출에 지역변수 f가 스택영역에 할당

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함