개발이야기/CSAPP
[CSAPP]배열과 구조체는 메모리에서 어떻게 표현될까?
Study & Stack
2025. 5. 30. 00:43
728x90
1. 개요
이번 회차에서는 C 언어의 배열과 구조체가 메모리에서 어떻게 표현되는지 살펴본다.
이 내용을 이해하면 포인터 연산, 메모리 접근, 구조체 최적화의 기초를 다질 수 있다.
2. 배열의 메모리 표현
2.1 배열의 연속성
C에서 배열은 연속된 메모리 블록에 저장된다.
int a[3] = {10, 20, 30};
- a[0] → 시작 주소
- a[1] → 시작 주소 + 4바이트
- a[2] → 시작 주소 + 8바이트
→ 메모리에 연속적으로 저장됨
2.2 어셈블리 접근 방식
int val = a[i];
→ 어셈블리:
movl a(,%rdi,4), %eax # a + i*4 → %eax
- rdi는 인덱스 i
- 4는 int 타입 크기
2.3 다차원 배열
int mat[3][4];
- 내부적으로는 1차원 배열처럼 row-major 순서로 저장됨
- mat[i][j]는 base + (i * column + j) * sizeof(int)
→ 어셈블리:
movl mat(,%rax,4), %eax # 단일 인덱스 접근
3. 구조체의 메모리 표현
3.1 구조체는 필드를 순서대로 저장
struct Point {
int x;
int y;
};
→ 메모리 배치:
- x: offset 0
- y: offset 4
→ 총 크기: 8바이트
3.2 패딩(Padding) 문제
struct Mixed {
char c;
int i;
};
→ 메모리 배치:
- c: offset 0 (1바이트)
- padding: 3바이트
- i: offset 4
- 전체 크기: 8바이트
⚠️ CPU는 4바이트 정렬된 주소에서 int를 읽는 것을 선호함 컴파일러가 정렬을 위해 패딩 바이트를 삽입함
3.3 중첩 구조체와 배열 포함 구조체
struct Rectangle {
struct Point tl;
struct Point br;
};
- 구조체 안의 구조체도 그대로 포함됨
- 배열을 포함할 경우에도 연속 저장
4. 구조체 크기 최적화 팁
struct Bad {
char a;
int b;
char c;
};
// → 총 12바이트 (패딩 존재)
struct Good {
int b;
char a;
char c;
};
// → 총 8바이트 (패딩 최소화)
✅ 크기가 큰 필드를 먼저 배치하면 패딩을 줄일 수 있음
5. 요약 정리
- 배열은 메모리에 연속적으로 저장되며, 주소 계산을 통해 접근된다
- 구조체는 필드 순서대로 저장되지만, 정렬 요구사항에 따라 패딩이 삽입될 수 있다
- 메모리 효율을 높이려면 구조체 필드 순서를 잘 구성해야 한다
- 배열과 구조체 내부 표현을 이해하면 포인터 연산과 메모리 디버깅이 쉬워진다
728x90