컴퓨터는 어떻게 많은 데이터들을 저장하고, 가져올 수 있을까?
int main() { int var = 10; var = 5; printf("%d\n", var); return 0; }
main 함수에서 변수 var를 선언하면 어디에 저장되며, 새로운 값을 할당 할 땐, 어떻게 값이 바뀌는지, 그 과정에 대해 탐구해보자.
main 함수를 실행 하기 전에 메모리가 무엇이며, 어떤 구조를 가지고 있는지 공부해보자.
배가 고픈 제임스가 치킨을 주문하고, 배달원을 기다리고 있다. 1시간이 지나고, 2시간이 지나도 배달원이 오지 않아, 치킨집에 전화 하여 문의를 했다. 사장님은 이렇게 얘기했다. '집 주소가 없어서 모든 집을 방문하고 있었어요~'
말도 안되는 이유이지만, 실제로 주소가 없다면 위 방법을 사용해야 한다.
main 함수가 호출돠면, main 함수는 어떤 메모리 값을 가진다. 0번 메모리에 있을 수도, 100번 메모리 일 수도 있다. 어떤 메모리를 가지는지는 정확히 알 수 없다! 어쨋든 main 함수는 어떤 메모리, 주소를 가지게 됐다.
메모리는 위 그림과 같이 1byte씩 나열된 구조를 가지고 있다. 어떤 주소에는 os가 있고, 프로세스가 있고, 빈공간도 있다. 빈공간이라고 안쓰는 공간이 아니다.
메모리는 1바이트씩 연속적으로 존재 한다는 사실을 알았다! 그렇다면 main 함수 내부의 변수들은 어떻게 저장이 되는지 알아보자.
이는 주소 공간(address space)라고 한다. 프로세스가 실행 되면 함수, 변수들은 stack 구조에 저장되고, 동적으로 메모리를 할당 하는 경우 heap구조에 저장된다.
궁금증이 하나 생긴다. 그럼 stack 내부에 있는 변수와 함수들이 메모리에 저장 되어 있으니까 언제든지 접근이 가능 하네요?
int main()
{
int var = 1;
for(int i = 0; i < 3; i++)
{
int var = 2;
var++;
}
printf("%d\n", var);
return 0;
}
위 함수를 실행하면 1이 나올까 5가 나올까?
main 함수가 시작되며 'int var = 1'을 만나 stack에 'var'변수를 저장된다. 이 때 BP(base pointer)는 해당 스택 프레임을 가르킨다. 즉, var 변수의 주소를 가르킨다. 또한 SP(stack pointer)도 var를 가르킨다.
다음으로 for문을 만나 새로운 변수 'var(for문 안)'도 스택 메모리에 저장 된다. 이 때 'var'를 가르키고 있던 SP가 새로 저장된 'var(for문 안)'을 가르킨다.
이제 반복문이 끝났다. SP는 아직도 반복문의 변수를 가르키고 있을까?
아니다. 반복문이 종료되면, stack에 저장 됐던 반복문 데이터도 같이 사라지고, SP는 다시 처음에 가르키던 'var'를 가르킨다.
따라서 위 프로그램의 결과는 1 이다.
BP는 스택 프레임이 시작하는 주소를, SP는 스택 구조 가장 위에 있는 데이터의 주소를 가르킨다.
cpu는 변수를 읽어들이거나, 함수를 읽어들이거나, 지역변수를 구별하거나 하지 못한다. 단순히 0과1을 빠르게 읽어들이고, 연산만 한다. 지금 들어온 값이 'var'에서 온지 'var(for문 안)'에서 온지 알 수 없다. 그래서 메모리는 복잡하게 얽힌 컴퓨터 세상에서 이정표의 역할을 맡고 있다. 각 변수에 할당 된 메모리 값을 통해 우리가 가져와야 할 데이터를 쉽게 가져 올 수 있다.
메모리를 잘 이해하지 못한다면, 컴퓨터를 모르는 것이나 마찬가지다. 두고두고 보고 또 보면서 제대로 된 이해를 꼭 하자!