달력

4

« 2024/4 »

  • 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

''에 해당되는 글 1

  1. 2016.08.15 프로그램의 메모리(code, data, heap, stack)

대충 이런 식

0x0100          ~          0x1000

코드 - 데이터(+bss) - 힙 - 스택



컴파 일타임에 크기 결정

code(text) : 프로그램의 코드가 들어가는 곳

data : 전역변수 등

(bss : 초기화가 안 된 전역변수)


런 타임에 크기 결정

heap : 동적할당변수

stack : 함수변수(지역변수, 파라미터)





tip)

낮은 메모리 순서로 콧대휘어쓰(코데힙스 = code data heap stack의 두음을 딴 것)......라고 외우면 된다는 전설적인(?) 이야기를 듣고 그대로 외우고 있다.

메모리 순서가 안외워져서 머리를 책상에 박았더니 콧대가 휘었더라..=_=;; 뭐 대충 이런 이야기였다.


안외워지면 저렇게라도 외워야지 뭐 어쩌겠어.

근데 사실 이해를 제대로 하면 외울 필요가 없다.

아래 글을 보고 이해를 해 보자.


일단 코드와 데이터는 compile-time에 크기가 결정된다.

여기는 코드 저장소...

code : 말 그대로 소스코드 들어가는 곳이다. 그 외 나머지는 일단은 모조리 변수가 들어가는 곳이라고 보면 된다. 상식적으로 당연히 낮은 메모리부터 채워나간다는 것...


여기서부턴 변수 저장소 시리즈...

data : 데이터를 저장할 수 있는 곳은 변수다. 가장 먼저 등장하는 것은 가장 중요한 것이어야 한다.

변수 중 프로그램에 가장 광범위하게 영향을 미칠 수 있는 것이 전역변수다.

그러므로  code영역의 바로 뒤인 data영역에 저장한다.

(bss : 초기화가 되지 않은 전역변수는 여기에 저장한다. 굳이 data 영역과 왜 나눴는지는 모름.)


다음으로 힙과 스택은 run-time에 크기가 결정된다.

heap : 동적할당 변수를 위한 공간이다. 프로그래머가 관리할 수 있는 영역이기 때문에 낮은 메모리부터 오름차순으로 올라가는 것이 개발자가 알기 편하다(실제로 그런 이유 때문인지는 잘 모르겠다)고 생각하면 될 것 같다.

stack : 함수 호출과 관련된 메모리를 관리하는 영역이다. 프로그램 전체에 할당된 메모리영역의 맨 뒷주소부터 차례로 내려오면서 스택메모리가 쌓이게 된다. call-stack을 추적하는 것도 최근에 불린 함수부터 역으로 추적하기 때문에 왠지 뒤에서부터 쌓이는 것이 자연스러울 것 같다.

'Basic Languages' 카테고리의 다른 글

개발을 배울 수 있는 곳  (0) 2016.08.07
:
Posted by 클레잇