프로세스의 모든 데이터는 메모리에 적재되어있고 메모리로의 접근은 가상 주소를 통해 이루어진다.
가상 메모리에 코드, 데이터, 힙, 스택 영역이 구성되는 것
메모리의 주소공간은 여러 세그먼트로 분할된다. 모든 제이터는 자신의 수명동안 유일한 주소를 가진다.
int main(void) {printf("Hello") ...}에서 "Hello"는 데이터고, 나머지 부분만 코드에 2진수로 저장됨
main 실행 -> printf 함수 호출 후 뒷부분 stack에 저장 -> printf에서 "Hello"데이터 호출 -> 실행 종료 후 main으로 돌아옴
Data: 데이터가 저장되는 공간
Data 영역에 저장되는 데이터의 종류는 전역변수, static변수, 문자열이 있다
BSS: 초기화되지 않은 데이터 저장
초기화되지 않은 데이터는 메모리 영역만 잡고있다
Initialized Data: 초기화된 데이터 저장
BSS와 초기화 데이터를 구분하는 이유
BSS에는 실행파일에 데이터 크기만큼의 메모리를 잡아야한다는 정보만있고 실제로 배정하진 않음. 따라서 컴파일 시에는 실행파일의 크기를 줄일 수 있다.
=> 하지만 실제 실행 시에는 자동 초기화되어 메모리 배정받음.
Heap: 동적 할당 메모리공간
malloc(), calloc()을 통해 할당
Stack: 지역변수 등 임시로 사용하는 데이터가 저장, 큰 주소부터 작은 주소로 채워가며 사용
지역변수, 함수의 매개변수, 함수 반환값, 함수 복귀 주소 저장
메모리의 입출력은 워드단위이다. 워드란 컴퓨터에서 한번에 처리할 수 있는 크기로, short와 int가 같이 있는 구조체여도, short뒤의 남은 2바이트를 dummy로 제공하여 워드 단위로 정렬하도록 한다.
-fpack-struct를 제공하면 dummy를 넣지 않고 메모리를 배정한다.