C++ 은 memory를 할당하기 위해 사용하는 방법에 따라 3가지 memory 관리 방식이 있다. : automatic storage, static storage, 그리고 dynamic storage(가끔 free store나 heap으로도 불림)
세가지 방식으로 할당된 data object는 lifetime이 서로 다르다. 우리는 빠르게 각각을 살펴 보겠다. (C++ 11은 thread storage라 불리는 4번째 form을 추가했다.)
- Automatic Storage
함수 안에서 정의된 평범한 variable들은 automatic storage를 사용하고 이 들을 automatic variable이라 부른다. 이 용어는 이 variable들을 포함하는 함수가 호출될 때 자동적으로(automatically) 생기고, 함수가 끝나면 만료된다(expire). 실제로 automatic value들은 이것들을 포함한 block에 지역적(local)이다. block 은 {}사이에 동봉된 코드 부분이다. 지금까지, 우리의 모든 block들은 함수 전체였다. 그러나 함수 안에서도 또 다른 block을 가질수 있으며, 그러한 block들 안에 variable을 정의하면, 그것은 오직 프로그램이 해당 block안에서 문장들을 실행하는 동안만 존재하게 된다. Automatic variable들은 기본적으로 STACK 에 저장된다. (STACK의 구조상) 프로그램이 코드 block에 들어갔을 때,variable들은 순서대로 STACK memory 안에 추가되고, 실행이 block을 떠나면 역순으로 memory에서 해제된다(free)
cf. STACK 구조는 LIFO(Last-in, first-out process)라 불린다. 그래서 STACK은 프로그램 처리에 따라 늘었다 줄었다 한다.
- Static Storage
Static storage는 전체 프로그램의 실행 내내 존재하는 storage이다. variable을 static으로 만드는 2가지 방법이 있다. 하나는 외부적으로(externally) 함수의 바깥에 variable을 정의하는 것이다. 다른 하나는 variable을 선언할 때 static Keyword를 사용하는 것이다:
static double fee = 56.50;
automatic 과 static stroage에 대해 알아둬야할 메인 포인트는 이런 방법들이 엄격히 "variable들의 lifetime을 정의한다"는 것이다. variable이 전체 프로그램 동안에 존재(static variable)하거나 오직 특정 함수가 실행되는 동안에만 존재한다.(automatic variable)
- Dynamic Storage
new 와 delete Operator는 automatic 과 static variable보다 더욱 유연한 접근을 제공한다. 이 operator들은 C++이 free store 또는 heap 이라고 일컫는 memory pool을 관리한다. 이 pool은 static 과 automatic variable들을 위해 사용되는 memory와 구분되어 있다. new 와 delete 는 한 함수 안에 memory를 할당하여 다른 함수에서 해제하는 것을 가능하게 해준다. 따라서, data의 lifetime은 프로그램이나 함수의 lifetime에 영향받지 않는다. new 와 delete 을 함께 사용하는 것은 ordinary variable들을 사용하는 것보다 프로그램이 memory를 사용하는 방식에 있어서 더 나은 제어를 제공한다. 그러나 memory 관리는 더욱 복잡해진다. STACK에서는, 자동적인 추가, 제거 메커니즘이 memory부분이 계속 이어져있는 반면에 new와 delete 의 상호작용은 사용되는 memory의 lifetime이 달라지다보니 free store에 구멍을 남길 수 있다.
---------------------------------------------------------------------
Management Records
Chapter 9. Memory Models and Namesapces - Storage Duration, Scope, and Linkage
---------------------------------------------------------------------
'객체 지향 설계' 카테고리의 다른 글
Knowing Your Objects: this Pointer 1. (0) | 2018.02.25 |
---|---|
static Class Members (0) | 2018.02.25 |
C++ inline functions (0) | 2018.02.21 |
동적 할당) Freeing Memory with delete (0) | 2018.02.21 |
동적 할당) Allocating Memory with new (0) | 2018.02.21 |