[C] C언어의 메모리 구조 (스택, 힙, 데이터, 코드 영역)
C 언어의 메모리 구조는 크게 스택 영역(Stack Area), 데이터 영역(Data Area), 코드 영역(Code Area), 힙 영역(Heap Area)있다.
스택 영역(Stack Area)
스택 영역은 프로그램이 동작 시 지역변수, 매개변수, 표준버퍼, 시스템(OS) 임시데이터가 생성되고 사라지는 영역이다.
예를 들어 int, char, double, void, float 등 기본 자료형 과 if, for, while 등의제어문의 내부에서 선언된 변수는 제어문을 빠져나오면 수명이 다한다.
함수의 호출시 매개변수나, 함수의 내부에서 사용되는 지역변수도 마찬가지이다.
이러한 데이터들이 프로그램이 동작하는 동안 스택에서 생성과 소멸을 반복하고 있다.
스택은 순차적으로 데이터를 저장하고 꺼내는 LIFO(Last In First Out) 방식으로 동작하는데 가장 마지막에 생성된 데이터를가장 먼저 꺼내서 읽을 수 있다.
이러한 방식의 장점은 메모리의 공산을 낭비 없이 사용할 수 있다는 점과 메모리 영역에서 속도가 가장 빠르며, 동작방식의 특성상 순차적인 명령을 읽었다가 순차적으로 수행하는데 최적화 되어있다.
스택은 메모리의낮은 주소부터 시작하며, 힙 영역이 끝나는 곳에서 서로 만난다.
데이터 영역(Data Area)
데이터 영역은 전역변수와 정적변수(static) 변수가 저장되는 영역이다.
이 여역에 할당되는 변수들은 프로그램의 시작과 동시에 할당되어, 프로그램이 종료될 때 소멸된다.
따라서 전역변수와 정적변수는 프로그램이 종료 할 때까지 존재하는 변수들이다.
데이터 영역은 세부적으로 Data영역과 Bss영역으로 구분되기도하는데, Data 영역은 초기값을 가진 전역변수와 정적변수가 할당되는 공간이고, Bss 영역은 초기화하지 않은 전역변수와 정적변수가 기본값 0을 가지고할당되는 공간이다.
Data 영역은 메모리 영역에서 속도가 2번째로 빠르며, Code영역이 끝나는 곳에서 시작하며, Data영역이끝나는 곳에서 Bss영역이 시작된다.
보통은 Data 영역과 Bss영역을 통틀어 Data 영역이라고 부르는 것이일반적이다.
코드 영역(Code Area)
코드영역은 텍스트(Text) 영역으로도 불리며, 함수 코드(원형부) 함수 구현부, 각종 명령들과 상수값이 저장되는 영역이다.
우리가 C등의 프로그래밍 언어로 작성한 모든 것은 컴파일러를 통해 기계어로 번역된다.
예를 들어 1 + 2 연산의 수행 절차는, 상수 1과 2에 대한 2진코드를 먼저 CPU에 전달하고, 연산자 + 에대한 2진 코드를 CPU에 전달하면, CPU는 명령을 감지하여 + 연산을 수행하게 된다.
이때, 자신에게 미리 들어와있는 데이터 1과 2를 사용하게 되는 것이다.
메모리 영역에서 소도가 3번째로 빠르며, 프로그램이 실행 될 때는 먼저, 동작 시 필요한 모든 데이터들은 메모리 상에 로드하게 되는데, 사용되는 모든 상수들과 명령들을 저장하는 영역이 Code 영역이며, 메모리의 가장 높은 주소에 위치한다.
각종 함수들의 호출주소, 연산자들의 2진코트, 상수 값 등이 이 영역에 포함된다.
힙 영역(Heap Area)
힙 영역은 프로그래머에 의해 동적으로 공간을 할당하는 영역이다.
예를 들어 배열, 클래스, 컬렉션, 동적변수(크기를 정하기 어려운 변수)등이 있다.
힙 영역은 데이터영역이 끝나는 곳부터 시작된다.
프로그래머가 직접 지정하지 않는 경우에는 이 영역은 사용되지 않는다.
이 영역을 사용하기 위해 C 언어에서는 malloc 과 free 등의 함수를 사용 할 수 있다.
물론 메모리를 굳이 동적할당 하지않아도 프로그램은 정상적으로 동작한다.
프로그래머가 신경 안 써도 되고, 신경 쓸 필요도 없고, 알아서 잘 동작하는 스택 영역이 있기 때문이다.
하지만 메모리 관리의 효율성과 시스템 성능을 위해 힙 영역은 반드시 사용될 수 밖에 없다.
프로그램이 커지면 커질수록, 데이터가 많으면 많을수록 힙 영역은 반드시 필요하게 되어있다.
그렇다 해도 힙 영역은 사용하지 않아도 된다.
다만, 실력 없는 프로그래머로 영원히 남을 뿐이다.
댓글
댓글 쓰기