2016년 3월 8일 화요일

[c++] 데이터, 스택(stack), 힙(heap) 영역

우리들이 프로그램을 실행하면, 운영체제는 우리들이 실행한 프로그램을 위해 메모리 공간을 할당해줍니다. 그냥 할당해 주느냐? 그것이 아니라 용도별로 메모리 공간을 할당해 운영체제가 메모리 영역을 구분해 메모리 공간의 효율적 사용을 하게 만들어 줍니다. 

* 데이터영역 : 전역 변수, Static변수를 위한 메모리 공간
 - 전역 변수 : 프로그램이 시작하자마자 메모리 공간에 올라가서 종료 될때까지 남아있는다.
 - Static 변수 : 프로그램 시작과 동시에 메모리 공간에 올라가서 종료될때까지 남아 있긴 한다. 
* 힙영역 : 런타임에 크기가 결정될수 있는 요소들을 올리기 위한 공간
* Stack : 컴파일 타임에 크기가 결정될 수 있는 요소들을 메모리 공간에 올리기 위한 영역

 각각의 영역에 대한 설명을 들었습니다. 아래 예제를 한번 보시죠. 
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void function (int);  
  5.   
  6. int main()  
  7. {  
  8.     int size;  
  9.     cin>>size;  
  10.     function(size);  
  11.     return 0;   
  12.     //메인함수에서 요구되어 지는 메모리 공간의 크기는 컴파일 타임에 크기가 결정 가능하다.   
  13.         //이런 것을 올리기 위한 영역이 Stack이다.  
  14. }  
  15.   
  16. void function(int i)  
  17. {  
  18.     static int i = 10; //function이라는 함수가 처음 호출될때 i라는 변수가 초기화 된다.   
  19.     int array[i];   
  20. }  
  위의 예제는 에러를 일으키는데 위에서  function이라는 함수는 컴파일 타임에 요구되어 지는 메모리 크기를 계산하기는 불가능합니다. array라는 배열을 선언하기에 있어서 그 크기를 전달되는 인자값에 의해서 결정되어 지는데, 이 i 값은 고정이 아니라, 프로그램을 실행하는 사람에 의해서 값 변동이 심할 것입니다. 
  그러면 컴파일 되는 동안에 function이라는 함수내에서 요구되어지는 메모리 크기를 컴파일 타임에 결정할 수 없게 되고, 이 크기는 입력되는 size값이 결정되어야만 결정이 되죠. (이 사이즈는 누군가 프로그램을 실행하여야 결정되기 때문에 Array배열의 사이즈 크기는  런타임에 결정이 된다.)

 - 일반적으로 int array[i]; 이렇게 선언하면, 스택에 올리라는 의미가 된다. (이것은 스택에 못올린다.) 그래서 우리가 힙이라는 메모리 공간에 이런 배열을 선언하기 위해 malloc과 free라는 함수를 사용하게 되는 것이죠. 

- Malloc : 힙에다가 메모리 공간을 할당하기 위한 함수 , free는 malloc으로 할당된 메모리 공간을 해제 하기 위한 함수이다. 
- free 함수가 필요한 이유 : 힙이라는 메모리 공간은 프로그래머가 관리 하는 메모리 공간이기 때문에 malloc을 쓰면 free로 꼭 해제를 해줘야 한다. 

댓글 없음:

댓글 쓰기

[Effective C++] 항목 30 : 인라인 함수는 미주알고주알 따져서 이해해 두자.

인라인 함수를 사용하면 컴파일러가 함수 본문에 대해 문맥별 최적화를 걸기가 용이해집니다. 인라인 함수의 아이디어는  함수 호출문을 그 함수의 본문으로 바꿔치기하자는 것  남발했다가는 코드의 크기가 커질 게 뻔하다. 인라인 함수로 부풀려진 ...