메모리 구조, 변수 본문
전역변수 (global)
- 프로그램 실행 시 데이터 영역에 할당되어서 프로그램이 종료될 때까지 남아있는 변수
- 초기화 되지않은 전역변수는 BSS(Block Started by Symbol) 영역에 할당
정적변수 (static)
- 프로그램 실행 시 데이터 영역에 할당되어서 프로그램이 종료될 때까지 남아있는 변수
- 초기화 되지않은 정적변수는 BSS(Block Started by Symbol) 영역에 할당
(but 코드 본문에서 사용되지 않으면 메모리 할당x)
- 전역변수의 성격을 지니는 지역변수로 static 변수가 선언된 함수가 처음 호출될 때 1번만 초기화
- 함수 내에서 접근 가능 + 함수가 끝나도 메모리 유지 가능
지역변수 (local)
- 중괄호 {} 내에서 선언된 변수. 선언된 지역 내에서만 메모리 유지 및 유효함
- 암시적으로 auto 키워드로 선언되기 때문에 자동으로 register 변수로서 레지스터에 할당되기도 함
(컴파일러에 의한 최적화 수행)
- 레지스터에 할당되어 전역변수보다 빨라질 수 있다는 장점
register 변수
- 사용자가 직접 자주 사용되는 지역변수를 레지스터에 할당하고 싶을 때 사용
(레지스터 공간 여건에 따라 할당)
volatile 변수
- 현재 코드 밖에서 변수의 값이 변할 수 있기 때문에 컴파일러가 최적화를 하지 않도록 함
(컴파일러에 의한 최적화로 인한 코드 단순화, 레지스터 사용 등을 막음)
- MMIO (Memory-mapped I/O)로 하드웨어 장치에 매핑된 변수, 인터럽트 서비스 루틴 및 멀티스레드에서
공유되는 전역변수에 사용
ps. 힙 영역에 동적 할당된 공간을 전역적으로 쓰고 싶다면?
전역 포인터 변수 선언 후 main 함수 내에서 동적할당
참고: http://tcpschool.com/c/c_memory_structure
'Study > Etc' 카테고리의 다른 글
디렉토리 브루트포스 (Directory Bruteforce) (0) | 2018.02.09 |
---|---|
멜트다운 취약점 원리 간단요약 (0) | 2018.02.07 |
Dangling Pointer와 Use-After-Free (0) | 2017.11.30 |
랜섬웨어 시뮬레이터 RanSim (0) | 2017.11.03 |
Dependency Injection (DI) (0) | 2017.08.22 |