개발이야기/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