storage_duration — 저장 기간
storage_duration — 저장 기간 (Storage duration)
**저장 기간(storage duration)**은 객체가 메모리에 얼마나 오래, 어디에 존재하는지를 정의하는 개념이에요. 자동, 정적, 스레드, 동적의 네 종류가 있어요.
객체의 수명(lifetime)은 그 저장 기간과 초기화 방식에 따라 결정돼요. 언제 객체가 생성되고 파괴되는지 이해하는 것이 메모리 관리의 핵심이에요.
출처: cppreference
본문
저장 기간은 객체의 저장에 대한 규칙이에요. C++에는 네 가지 저장 기간이 있어요.
자동 저장 기간 (Automatic storage duration)
- 범위(블록) 안의 지역 변수가 기본으로 가져요.
- 블록에 진입하면 생성되고, 블록을 벗어나면 소멸돼요 (역순으로).
- 예: 함수 안의
int x;
void f() {
int x = 5; // 여기서 생성
{ int y = 6; } // y 는 여기서 소멸
} // x 는 여기서 소멸
정적 저장 기간 (Static storage duration)
- 전역 변수,
static변수,static멤버가 가져요. - 프로그램 시작 시 생성되고, 프로그램 종료 시 소멸돼요.
- 0 초기화 후 초기화돼요.
int global = 42; // 전역: 정적 저장 기간
static int file_local = 7; // 정적
스레드 저장 기간 (Thread storage duration)
thread_local변수가 가져요.- 각 스레드마다 별도의 객체가 존재해요.
- 스레드 시작 시 생성, 스레드 종료 시 소멸.
thread_local int tls = 0;
동적 저장 기간 (Dynamic storage duration)
new로 할당한 객체가 가져요.- 명시적으로
delete할 때까지 수명이 지속돼요. - 힙(heap)에 존재하고, 스코프와 무관해요.
int* p = new int(42);
// ... 사용
delete p; // 명시적으로 해제
정리 요약
| 저장 기간 | 생성 | 소멸 | 위치 |
|---|---|---|---|
| 자동 | 블록 진입 | 블록 탈출 | 스택 |
| 정적 | 프로그램 시작 | 프로그램 종료 | 전역 메모리 |
| 스레드 | 스레드 시작 | 스레드 종료 | 스레드 로컬 |
| 동적 | new | delete | 힙 |
노트 (Notes)
static/thread_local/extern지정자는 변수 선언에 저장 기간이나 연결을 지정해요.- 동적 객체는 RAII(스마트 포인터)로 관리하는 것이 권장돼요.
- 저장 기간과 연결(linkage)은 별개의 개념이에요.