C++ Storage Classes, Linkage and Memory

규규·2024년 3월 12일
0

C++

목록 보기
11/21

Process memory layout

  • Text segment : binary image of the process. (Read Only)(0x08048000~)
  • Data segment : Static variables explicitly initialized
  • BSS(Block Started by Symbol) segment : Untinitialized static variables, filled with zeros (0으로 초기화)
  • Heap : Dyanamic memory allocation through malloc,new,free,delete (필요한 메모리 크기를 컴파일 할 때는 알 수 없음)(운영체제에 메모리를 요청하고, 가상 메모리를 사용하기 때문에 메모리 할당, 해제가 속도가 느림)
  • Stack : Automatic variables. (local to a function's space) caller's return adderess, etc. (컴파일 할 때 사용 할 메모리 크기를 이미 알고 있어서, 메모리 할당 해제가 속도가 매우 빠름) (여기까지 ~3GB)
  • Command line arguments and environment variables
  • OS kernel space : 침범 시 Segmentation fault (0xc000000 ~ 0xFFFFFFF)(~1GB)
  • Word size 가 32 bit 인 아키텍처는 프로세스 가상 메모리 사이즈가 4GiB(2^32 byte)
    요즘 64 bit 아키텍처는 프로세스 가상 메모리 사이즈가 16엑사 바이트 (2^64 byte)

출처 :

C/C++ 변수 저장 공간의 다섯가지 분류

용어 :

  • Scope(영역)
    • 변수의 참조자가 존재하는 영역
    • scope 의 종류 : block, function, function prototype, file (global variable, 전역 변수)
  • Linkage(연결상태)
    • 전역 변수 (file scope variables) 은 external or internal linkage(static) 가능.
    • 컴파일러의 변환 단위(translation unit) 은 c 파일 1개임. c 파일간의 연결은 링커가 담당.
  • Duration(지속기간) : 메모리에서의 지속 시간

static 변수

  • static 변수 : 전역 변수 / 지역 변수 + static keyword
  • 선언만 해도 '0' 값으로 컴파일러가 알아서 초기화가 됨. static 변수는 초기화가 한번만 됨. (컴파일 타임에 되므로)
  1. 프로그램이 시작 될 때 메모리에 할당되고, 프로그램이 끝날때까지 유지 됨. (Data, BSS segment 에 위치). 컴파일 타임에 메모리 주소가 정해져서, Binary 에 하드 코딩 됨.
  2. Scope 를 현재 영역(블록, 파일)으로 한정 지음. (전역변수에 static keyword 사용 시 extern 불가)
  • Automatic

    • 일반적인 지역 변수.
    • stack 영역에 메모리가 할당 됨.
  • Register

    • registry 변수 사용 등은 요즘 컴파일러 최적화 기능이 매우 좋아서, 컴파일러가 자동으로 해주는 경우도 있음.
  • Static with internal linkage

    • 전역 변수를 static keyword 로 선언한 경우.
    • 외부 파일에서 linkage (extern) 이 안됨.
  • Static with external linkage

    • 일반 전역 변수.
    • 외부 파일에서 linkage (extern) 가능.
  • Static with no linkage

    • block 안에서 static keyword 로 변수를 선언하는 경우.
    • linkage 없음.
    • block 및 함수 내의 static 변수의 수명은 block 및 함수 종료 시 종료 됨 (지역 변수와 동일)
    • 단, 특별하게 함수 내에서 static 변수로 초기화 한 경우, 동일 함수를 호출 할 경우 두번째 초기화 sentence는 생략이 되고, 함수를 종료 한다고 하더라도 이전 호출 시의 값이 유지가 됨. (재귀 함수 등에서 활용 가능)
  • ex:

void func1(){
    static int a = 1;
    std:: cout << a << endl;
    a++;
}

using namespace std;
int main(){
    func1(); // 1 이 출력 됨.
    func1(); // 2 가 출력 됨.
}
  • nested block
    • nested block 에서 내부의 block 은 변수의 수명이 유지 됨. (외부의 block 의 변수 활용 가능)

함수의 저장 공간

  • 함수는 external 이 default 이고, static 도 가능.
  • 함수는 프로그램 시작 시 loading 이 되고, 프로그램 종료 시 까지 계속 존재.
  • static 을 사용하면, 현재 파일 안에서만 사용 가능. (linking 불가)
    • ex : `static void func_test(){ ~ }
    • c파일을 모듈이라 생각하면, 모듈을 캡슐화해서 외부 interface 에 드러나지 않는 함수를 만들고 싶을 때 사용 함.
profile
복습용 저장소

0개의 댓글

관련 채용 정보