데이터를 저장할 공간을 적정하게 나누는 작업이 메모리 할당(Memory Allocation)이다.
정적 메모리 할당
컴파일러가 소스 코드를 기계어로 번역하는 시점(컴파일)에 변수 크기게 맞게 메모리에 할당하는 것이다. 수정하려면 소스 코드를 바꾸고 다시 컴파일해야 하므로 유지보수 시에 어려움이 있다. 다시 말해서 프로그램 실행 시 할당된 메모리의 크기는 변경이 불가하다. 프로그램 실행 시 메모리의 위치가 결정되기 때문이다.
지역 변수의 갯수가 늘어나거나 줄어들기 때문에 스택(stack)이라는 자료구조를 채용해서 지역 변수 영역을 관리한다.
하지만 주의할 점은, 자료구조에서 배운 스택(이론)과 실제 컴퓨터 시스템의 스택(실제)의 동작은 아래와 같이 상반된다.
이 때 ax는 cpu 안에 있는 메모리(레지스터)이다. 위와 같이 명령어 push로 스택에 공간이 확보된다.
또한 명령어 pop으로 스택에 저장된 데이터가 날라간다.
전에와 같이 push, pop으로 하면 여러번 연산되기 때문에 비효율적이다. 그러나 sub와 add를 사용하면 단 1번에 공간을 확보하거나 날릴 수 있다.
pop bx
pop ax
mov ax, 5
push ax
push bx
블록 b의 값을 5로바꾸려면 위와 같이 5개의 연산이 필요하여 많이 비효율적이다.
위와 같이 포인터를 사용하면 1번에 접근하여 값을 읽거나 바꿀 수 있다.
pop IP는 어셈블리로는 실제로 ret이다.
위와 같이 단일 변수 혹은 모든 변수의 크기가 1MB를 넘게 되면 오류가 발생한다. 스택의 기본 메모리 크기는 1MB이기 때문이다.
동적 메모리 할당
c에서 동적 메모리 할당을 하고 싶으면 malloc이라는 함수를 쓰면 된다. 실제로 쓰는 사람이 어떻게 쓸지 모르니 malloc은 void 포인터형으로 반환한다. 할당한 것을 해제하고 싶으면 free를 쓰면 된다.