C언어의 기억수명 (storage duration)

MySprtlty·2023년 2월 3일
0

C

목록 보기
11/37

<글을 시작하기에 앞서...>
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()가 대표적이다.

📌차이점

  • 위 기억수명들의 차이점은 무엇일까.
  • 정적 기억수명과 자동 기억수명, 라이브러리에 의해 지원되는 할당 기억수명의 가장 큰 차이는 할당되는 대상체의 크기가 프로그램 실행 중에 고정되어 있는지 여부다.
  • 언어 차원에서 지원되는 자동, 정적 기억수명을 갖는 대상체는 프로그램이 실행되기 전에 그 크기가 상수로 고정되어 있어야 한다.

📌선언으로부터 대상체의 기억수명을 결정하는 방법

  • 파일 스코프를 가지고 선언되는 대상체는 모두 정적 기억수명을 갖는다.
  • 블록 스코프를 가지고 선언되는 대상체는 static이 붙지 않는 한 자동 기억수명이다.
  • 블록 스코프를 갖는 대상체를 선언하되, 기억 부류 지정자 static을 사용하면 명칭은 블록 스코프로 제한되지만, 대상체는 정적 기억수명을 갖게 할 수 있다.
    • 🔍ex) 대상체의 명칭은 블록 스코프지만, 대상체는 정적 기억수명을 갖는다.
    void foo()
    {
    	static unsinged short int count = 1;
    }
    • 블록 스코프/정적 기억수명 대상체도 프로그램이 실행될 때, 파일 스코프/정적 기억수명 대상체처럼 한번만 할당/초기화되어 종료될 때까지 유지된다.

0개의 댓글