|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=2035 [복사]
이번 장에서는 변수와 메모리의 관계를 알아보도록 하겠습니다.
변수는
- local variable(지역변수)
- global variable(전역변수)
로 나뉘어 집니다.
local variable은 function(함수) 내에서 선언되는 변수입니다.
global variable은 함수 밖에서 선언되는 변수 입니다.
int g1;
short g2;
void function1(void)
{
int a;
short b[10];
char c[20];
....
}
위의 예제에서 변수 a,b,c는 모두 local variable이며,
모든 local variable은 stack 영역에 할당이 됩니다.
변수 g1,g2는 모두 global variable이며,
모든 초기화 되지 않은 global variable은 기본적으로 .bss 영역에 할당이 됩니다.
만약 float pi = 3.141592; 와 같이 pi의 선언과 동시에 초기화가 되었다면,
이 변수는 .data 영역에 할당이 됩니다.
2장에서 linker command file을 통해서 프로그램이 실행될 memory의 구조와
각각의 영역별로 시작번지/크기를 설정해준다고 배웠습니다.
만약 local 변수를 아주 큰 사이즈로 선언하면 어떻게 될까요?
void function(void)
{
int b[100000];
....
}
이렇게 선언을 하면 compiler에 종류에 따라서 warning을 내주는 경우도 있고,
그렇지 않은 경우도 있습니다.
하지만, stack의 크기를 넘어서는 local 변수를 위와 같이 선언하고,
for(i=0; i<100000; i++) b[i] = i;
와 같은 code가 함수 내에서 수행이 된다고 가정하면, 무슨 일이 일어날까요?
사실 processor가 program를 직접 실행하는 중에는 지금 내가 access(read/write)하는 영역이
stack인지, 아니면 다른 영역인지 잘 알지 못하는 경우가 대부분입니다.
위와 같은 경우는 실제로, b[i]의 모든 번지에 i값이 저장되고,
만약 stack을 넘어서는 영역이라도 i값이 저장되게 됩니다.
stack과 인접한 memory에 다른 영역이 위치하고 있다면,
그 영역에 할당 되어 있는 변수나 코드를 i 값으로 바꾸게 되고,
결과적으로 program의 정상적인 수행을 못하게 만들어 버립니다.
이와 같은 경우를 stack overflow라고 합니다.
따라서, 큰 크기의 배열(array)는 가능한 local 변수에 할당하지 않도록 해야 합니다.
반면에 global variable은 프로그램 종료시까지 memory에 할당이 되어야 합니다.
크기가 큰 global variable들이 프로그램 중간 중간에만 사용이 되는 경우는
memory 입장에서는 낭비가 될 수 있습니다.
stack에 할당된 local variable은 함수의 시작~끝, 즉 함수가 실행되는 동안에만
stack에 자리잡기 때문에, 메모리 사이즈 입장에서는 훨씬 경재적입니다.
즉, function1 의 int a[100] 도 stack 에 할당이 되고,
function2의 int b[100]도 stack에 할당이 됩니다.
주어진 stack 공간을 넘어서지만 않는다면
함수 내에서 그때 그때 필요한 변수들은 동일한 stack이라는 공간을
계속적으로 활용하게 됩니다
하지만, function1에서만 이용되는 int a[100]과
function2에서만 이용되는 int b[100]을
global variable로 선언하게 되면
프로그램의 끝이 날때까지 항상 메모리에 a[100]과 b[100]이
자리잡고 있게 되어 많은 낭비가 됩니다.
NOTE:
이러한 것들을 해결하기 위해서 dynamic memory allocation 이라는 것이 있습니다.
추후 강좌에서 설명하도록 하겠습니다.
이번 장에서는 전역 변수/지역 변수와 메모리 할당에 대해서 알아보았습니다.
실제로 debugger를 통해서,
각각의 변수의 address를 한번 살펴 보시면,
위와 같은 규칙에 의해서 address가 할당이 되어 있는 것을 확인 할 수 있을 겁니다.
Best Regards,
Wolverine
|
Hit : 8211 Date : 2012/07/05 11:56
|