1619, 1/81 회원가입  로그인  
   wolverine
   [자작] C 강좌 [4] - Dynamic Memory Allocation

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2036 [복사]


이번 장에서는 dynamic memory allocation 에 대해서 알아보겠습니다.

지금까지 강의를 통해서

global variable은
build time memory allocation,
즉, build를 할 때에 변수가 할당되는 memory address가 결정이되며,
변수의 life-time은 프로그램이 끝날때까지,
즉, 프로그램이 종료 될때까지 메모리의 공간을 차지하고 있다
라는 것을 배웠습니다.

또한 local variable은
stack 이라는 메모리 영역에 현재 stack pointer의 위치에 따라서 그때 그때 할당이 되며,
변수의 life-time은 해당 함수가 return 될때까지,
즉, 함수가 return이 되면, 변수의 생명도 끝이 나며,
stack pointer도 함수가 호출되기 이전의 위치로 복귀하며,
또 다른 함수에서 또 다른 local 변수가 동일한 stack에 할당이 될 수 있다
라는 것을 배웠습니다.

global variable은
서로 다른 여러 함수에서 접근(access, read/write) 가능하며,
크기가 큰 array 형태로 선언할 수 있지만,
local variable은
함수 내에서만 접근 가능하며,
크기가 큰 array 로 선언하기에는 stack overflow의 위험이 있습니다.

그럼, 다음과 같은 func1~func9까지 순차적으로
호출되는 프로그램이 있다고 가정을 해보죠.

func1();
func2();
func3();
func4();
func5();
func6();
func7();
func8();
func9();

이때에,
func1~3는 동일한 int a[10000]이라는 변수 배열을 access 하고,
func4~6는 동일한 int b[10000]이라는 변수 배열을 access 하고,
func7~9는 동일한 int c[10000]이라는 변수 배열을 access 한다고,
가정을 해봅시다.

가장 간단하게는 global variable로 a,b,c 모두를 선언하면 됩니다.

하지만, 전체 프로그램의 life-time 동안 a,b,c가 항상 메모리 공간을 차지하게 됩니다.
func1~3이 수행되는 동안은 b,c는 전혀 필요가 없는데도 말이죠...

이러한 상황에서 메모리를 효율적으로 운용하기 위해서
dynamic memory allocation 을 사용하게 됩니다.
프로그램은 다음과 같이 그때 그때 필요한 변수 배열에 대한 메모리 영역을 할당 받아서
사용하고, 사용이 끝나면 할당 받은 메모리 영역을 다시 해제 하게 됩니다.

동적 메모리 할당
func1();  // 메모리 이용
func2();  // 메모리 이용
func3();  // 메모리 이용
메모리 해제

동적 메모리 할당
func4();  // 메모리 이용
func5();  // 메모리 이용
func6();  // 메모리 이용
메모리 해제

동적 메모리 할당
func7();  // 메모리 이용
func8();  // 메모리 이용
func9();  // 메모리 이용
메모리 해제

동적 메모리는 heap영역에 할당이 되며,
heap의 크기만큼 동적 메모리를 할당이 가능합니다.

int *a;

a = (int*)malloc(10000*4);  // 10000x4 byte 동적 메모리 할당


a[n] 형태의 배열로 이용...


free(a); // 할당된 메모리를 해제.

free함수는 할당된 메모리를 해제시켜 줍니다.
해제라는 말은 현재 a가 잡고있는 물리적인 메모리 공간을
다른 malloc에 의해서 이용가능하도록 하는 것입니다.

만약 다음과 같이 a,b를 차례로 할당하면,

a = (int*)malloc(10000*4);
b = (int*)malloc(10000*4);

b는 a의 base address에서  40000 byte 떨어진 공간에 할당이 됩니다.
하지만, 다음과 같이 free가 들어가면,

a = (int*)malloc(10000*4);
free(a);
b = (int*)malloc(10000*4);

b는 a가 할당되었던 메모리 위치에 다시 할당되게 됩니다.

이런 개념으로 dynamic memory allocation은
제한된 메모리 환경에서 효율적인 메모리 활용을 위해서
반드시 필요한 도구 입니다.
실제 상용 프로그램에서 필수적으로 이용되는 중요한 개념입니다.

이상으로 이번 장을 마치겠습니다.

Best Regards,
Wolverine














  Hit : 7982     Date : 2012/07/06 11:24



    
pkw5240 ㅎㅎ다음글은 뭔가여? 얼른올려주세요 2012/07/11  
wolverine 곧 올라갑니다. 회사에서 점심시간에 짬짬히 쓰고 있는데 .... ㅎㅎ 2012/07/11