<글을 시작하기에 앞서...>
1. C표준에서는 변수(variable)라는 표현 대신 대상체(object)라는 표현을 사용한다. (같은 뜻이다.)
대상체란 프로그램에서 사용할 값을 저장하는 메모리 상의 공간(영역)이다.
2. 필자는 식별자(identifier)라는 표현 대신 명칭이라는 표현을 사용한다. (마찬가지로 같은 뜻이다.)
🏷️기억수명 (storage duration, extent, lifetime)
- 기억수명이란 어떤 대상체가 값을 저장하기 위해 할당받은 메모리를 차지하고 있는 시간을 의미한다.
- 기억수명은 대상체와 관련된 개념이다.
- 🖇️cf. 스코프(scope)와 연결(linkage)는 대상체가 아닌 명칭과 관련된 개념이다.
- 프로그램에 선언된 모든 대상체가 프로그램이 시작하는 순간부터 종료되는 순간까지 항상 메모리를 차지하고 있는 것이 아니다.
- 🖇️cf. 이런 대상체를 정적 기억수명을 갖는다고 한다.
파일 스코프 대상체(전역변수)가 이런 기억수명을 갖는다.
- 각 대상체가 갖고 있는 기억수명이라는 특징에 따라, 특정 시점에 할당 받아 특정 시점에 해제되기도 한다.
- 흔히 사용되는 정적 할당, 동적 할당이라는 표현은 비표준적이므로 사용하지 않는 것을 추천한다.
- C언어가 제공하는 대상체의 기억수명은 다음과 같이 크게 세 가지다.
📌1. 정적 기억수명 (static storage duration)
- 프로그램이 시작해서 종료될 때까지 메모리에 항상 존재한다.
- 프로그램이 시작될 때 처음 할당된다.
📌2. 자동 기억수명 (auto storage duration)
- 자동 기억수명을 갖는 대상체는 그 대상체를 지칭하는 명칭의 스코프와 운명을 함께한다.
- 자동 기억수명을 갖는 대상체는 관련된 명칭이 선언되는 시점이 아니라, 블록이 시작할 때 할당된다.
- 그러나 할당된 대상체를 지칭할 때 필요한 명칭이 존재하지 않으면(아직 명칭을 선언하기 전이라서) 대상체에 접근할 방법이 없기 때문에, 자동 기억수명을 갖는 대상체는 명칭과 수명을 같이한다고 봐도 문제가 없다.
- 🔍ex) 아래 코드에서 대상체 b는
{
로 진입할 때, 이미 메모리에 할당된 상태다.
void foo(void)
{
int a;
double b;
}
📌3. 할당 기억수명 (allocated storage duration)
- 프로그램의 위치와 상관 없이 메모리를 원하는 순간에 요청하여 할당받아 사용하다가, 더 이상 필요 없으면 요청에 의해 해제할 수 있는 기억수명이다.
malloc()
과 free()
가 대표적이다.
📌차이점
- 위 기억수명들의 차이점은 무엇일까.
- 정적 기억수명과 자동 기억수명, 라이브러리에 의해 지원되는 할당 기억수명의 가장 큰 차이는 할당되는 대상체의 크기가 프로그램 실행 중에 고정되어 있는지 여부다.
- 언어 차원에서 지원되는 자동, 정적 기억수명을 갖는 대상체는 프로그램이 실행되기 전에 그 크기가 상수로 고정되어 있어야 한다.
📌선언으로부터 대상체의 기억수명을 결정하는 방법