1.5 메모리 구조

SeungHee Yun·2023년 8월 3일
0

전문가를 위한 C++

목록 보기
5/15

개요

프로그램의 실행을 위해선,
프로그램이 메모리( RAM - Random Access Memory ) 위에 올라갸아 한다.

또한 프로그램 내의 여러 변수를 저장하기 위한 메모리 공간이 필요하다.

이 메모리는,
통상적으로 코드( Code ), 데이터( Data ),
힙( Heap ), 스택( Stack ) 네 영역으로 나뉜다.


코드

코드 영역은, 실행할 프로그램의 코드가 저장되는 장소이다.
텍스트 영역이라고도 하지만, 주로 코드 영역이라고 부른다.

코드는 우리가 읽을 수 있는 형태가 아닌, 기계어로 저장된다.
또한 프로그램 실행에 필요한 코드이기 때문에,
프로그램의 실행부터 끝까지 메모리에 존재한다.

또한 코드 영역은 컴파일 타임에 결정되며 프로그램 실행 중
코드의 변경이 있으면 안되기 때문에 읽기만 가능하다.


데이터

데이터 영역에는, 전역( Global )변수와, 정적( Static )변수가 저장된다.

이 또한, 프로그램이 실행되고 끝날 때까지 메모리에 존재한다.
코드영역과 같이 프로그램이 종료되어야 메모리가 해제된다.

또한, 코드 영역과 다르게 Read-Write가 가능하다.


힙 영역은, "사용자가 동적 으로 할당할 수 있는 공간" 이다.
즉, 컴파일이 아닌, 런타임에 그 크기가 정해진다.

위 그림처럼,
힙 영역은 낮은 메모리 주소에서 높은 주소 방향으로 메모리를 차지하게 된다.

또한 스택과 메모리 공간을 공유하기 때문에,
힙 영역이 커지면 스택 영역이 작아지고 반대의 경우도 있다.

이러한 두 가지 경우를 다음과 같이 부른다.

스택오버플로우( Stack Overflow ) : 
스택 영역 > 힙 영역 ( 스택 영역이 힙 영역을 침범 )

힙오버플로우( Heap Overflow ) : 
힙 영역 > 스택 영역 ( 힙 영역이 스택 영역을 침범 )

또한 힙 영역에는 동적으로 할당 된 클래스 인스턴스등이 저장된다.

    class Car
    {
    public:
        string name = "";
    };

    int main()
    {
        Car stackCar; // 클래스 인스턴스  <<--- 스택에 저장

        Car* heapCar = new Car(); // 동적으로 힙에 할당된 클래스 인스턴스
        delete heapCar; // 힙에 할당된 메모리 해제
    }
* 데이터나 프로그램의 크기를 미리 알 수 없는 경우, 
스택에 저장하기에 너무 큰 경우 힙 영역에 저장 ( = 메모리 크기 제한이 없음 )

* 메모리 할당 / 해제 작업으로 인한 속도 저하 ( = 메모리를 직접 관리해야 함 )

* 힙 경합 ( 두 개의 쓰레드에서 동시에 데이터 
접근 원하는 경우, 경합이 발생 ) 으로 인한 속도 저하

* 힙 손상 ( 해제 후 사용, 덮어쓰기 등 ) 으로 인한 속도 저하

스택

스택 영역은 컴파일 타임에 크기가 결정되는 영역이며,
주로 지역 변수나 매개변수, 반환 값 등을 저장한다.

스택 영역에 저장되는 함수의 호출 정보를
스택 프레임( Stack Frame )이라고 부른다.

    class Car
    {
    public:
        string name = "";
    };

    int main()
    {
        int test = 7;                     <<--- 지역 변수

        Car stackCar; // 클래스 인스턴스  <<--- 스택에 저장

        Car* heapCar = new Car(); // 동적으로 힙에 할당된 클래스 인스턴스
        delete heapCar; // 힙에 할당된 메모리 해제
    }

컴파일 타임에 결정되다 보니,
힙 영역과 달리 동적으로 할당 / 해제가 불가하며,

함수가 실행되면 스택 영역에 올라오고,
함수가 종료되면 그 함수 내의 매개변수, 지역변수 등이 해제됩니다.

즉, 함수의 실행 / 종료에 따라 메모리의 할당 / 해제 또한 정해집니다.

또한, CPU에 의해 관리되어
힙 영역에 비해 빠른 속도를 가진다는 것이 장점입니다.

스택 영역은
높은 메모리 주소에서 낮은 메모리 주소 방향으로 메모리를 차지하게 됩니다.

또한, 힙 영역과는 달리 스택 영역은 메모리 크기에
제한이 있어서 이에 유념해야합니다.

또한 스택은 힙 영역보다 할당 속도가 빠릅니다.

왜냐하면, 스택은 이미 할당된 공간을 사용하는 것이고,
힙은 따로 할당하여 사용해야하기 때문입니다.

* CPU가 관리하여 속도가 빠르다.
* 메모리를 직접 해제하지 않아도 된다.
* 메모리 크기에 제한이 있다.

참조 : 참신 러닝 티스토리


profile
Enthusiastic Game Developer

0개의 댓글