06. 구조체 (Struct)

2025. 6. 30. 12:23·프로그래밍 언어/C

✅ 구조체란?

C 언어에서 구조체(struct)는 여러 자료형을 하나로 묶은 사용자 정의 자료형이다.

이는 멤버들의 자료형과 순서에 따라 구조체의 실제 메모리 크기가 달라질 수 있다.

그 이유는 정렬(Alignment)과 패딩(Padding) 때문이다.


📌 구조체의 메모리 정렬(Alignment)

CPU는 성능을 위해 메모리에 데이터를 자료형에 맞게 정렬해서 저장하길 원한다.

자료형  크기(byte)  정렬 기준
char 1 1바이트 정렬
short 2 2바이트 정렬
int 4 4바이트 정렬
double 8 8바이트 정렬

📌 정렬 기준이란?

→ 데이터는 자신의 정렬 단위의 배수인 주소에 저장되어야 함


🧱 구조체 내부의 패딩(Padding)

서로 다른 크기의 멤버가 순서대로 배치되면,

정렬 기준을 맞추기 위해 중간에 빈 공간(Padding)이 삽입됨


📌 예시

struct point {
    char x;    // 1 byte
    short y;   // 2 bytes
    int z;     // 4 bytes
};

💡 메모리 배치도

멤버 오프셋 설명
x 0 1바이트
padding 1 1바이트 (y는 2바이트 정렬 필요)
y 2~3 short (2바이트 정렬 만족)
z 4~7 int (4바이트 정렬 만족)

 

구조체 크기: 8바이트

printf("sizeof(struct point): %zu\n", sizeof(struct point));  // 8

📏 정렬이 없다면? (#pragma pack 사용)

#pragma pack(1)
struct point {
    char x;
    short y;
    int z;
};

→ 패딩이 사라져 메모리는 연속적으로 채워짐

→ 구조체 크기: 1(char) + 2(short) + 4(int) = 7바이트

⚠️ 하지만 정렬을 무시하면 성능 저하나 버스 에러가 발생할 수 있으니 주의!


🔄 구조체의 크기 계산 요약

  1. 각 멤버는 자신의 정렬 기준에 맞는 주소에 배치됨
  2. 정렬 기준을 만족시키기 위해 중간에 padding이 삽입됨
  3. 구조체 전체의 크기는 가장 큰 멤버의 정렬 기준의 배수가 되도록 정렬됨

📌 예시 2: 멤버 순서에 따른 구조체 크기 변화

struct A {
    char a;
    int b;
    char c;
};  // 크기: 12바이트 (패딩 포함)
struct B {
    int b;
    char a;
    char c;
};  // 크기: 8바이트 (패딩 줄어듦)

✅ 구조체 크기 최적화 팁

  • 큰 자료형 → 작은 자료형 순서로 멤버 정렬
  • 꼭 필요할 때만 #pragma pack 사용
  • 배열 안의 구조체가 많을 경우, 패딩 절약이 메모리 효율에 큰 영향을 줄 수 있음

✅ 마무리 요약

용어 의미
정렬 (Alignment) 멤버가 자신의 크기에 맞는 주소 위치에 정렬되어야 함
패딩 (Padding) 정렬을 만족시키기 위해 삽입되는 빈 공간
구조체 크기 멤버 + 패딩 포함, 가장 큰 멤버의 정렬 기준 배수로 맞춤
#pragma pack(n) 구조체 정렬을 강제로 제한하는 컴파일러 지시문

 

'프로그래밍 언어 > C' 카테고리의 다른 글

08. switch vs if...else if...else  (0) 2025.07.02
07. 공용체 (Union)  (0) 2025.07.01
05. 함수 포인터 (Function pointer)와 void 포인터  (0) 2025.06.27
04. 포인터와 문자열  (2) 2025.06.26
03. 자료형 변환 (Type casting)  (0) 2025.06.24
'프로그래밍 언어/C' 카테고리의 다른 글
  • 08. switch vs if...else if...else
  • 07. 공용체 (Union)
  • 05. 함수 포인터 (Function pointer)와 void 포인터
  • 04. 포인터와 문자열
coding-l7
coding-l7
  • coding-l7
    coding-l7rl0
    coding-l7
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 기타
      • 유니티
        • OfficeWorkerRunning
      • 프로그래밍 언어
        • C
        • C#
        • C++
      • CS
        • 컴퓨터 구조
        • 운영체제
      • 물리 기반 시뮬레이션
        • 기초
        • Cloth Simulation
        • Fluid Simulation
      • 코딩 테스트
        • 프로그래머스
        • 백준
      • 독서
        • [ 뇌를 자극하는 윈도우즈 시스템 프로그래밍 ]
        • [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]
        • [ CUDA 기반 GPU 병렬 처리 프로그래밍 ]
      • 영어
        • Basic Grammar In Use
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
    • 포트폴리오
  • 공지사항

  • 인기 글

  • 태그

    시스템 프로그래밍
    액체 시뮬레이션
    명령어
    bilateral blur
    fluid simulation
    C언어
    surface turbulence
    narrow range filter screen-space fluid rendering
    그리드 기반 방법
    정수 승격
    입자 기반 방법
    screen-space rendering
    wave simulation
    RAM
    pbd
    cloth simulation
    jump table
    GLSL
    OpenGL
    실수
    컴퓨터 구조
    유체 시뮬레이션
    fluid implicit particle
    상수
    파동 난류
    물리 기반 시뮬레이션
    Flip
    screen space fluid rendering
    position based dynamics
    collision
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
coding-l7
06. 구조체 (Struct)
글쓰기
상단으로

티스토리툴바