[C/C++] C++ 구조체 크기가 예상보다 큰 이유: 메모리 정렬과 패딩의 비밀

[C/C++] C++ 구조체 크기가 예상보다 큰 이유: 메모리 정렬과 패딩의 비밀

C
민호이 민호이 2025. 1. 16. 00:41
목차
  1. 1. 문제 개요
  2. 2. 메모리 정렬과 패딩의 원리
  3. 2.1 메모리 정렬이란?
  4. 2.2 구조체에서의 패딩
  5. 3. 정렬 방식에 따른 구조체 크기 비교
  6. 4. 최적화 방법
  7. 4.1 멤버 순서 조정
  8. 4.2 #pragma pack 사용
  9. 5. 결론
  10. Reference

1. 문제 개요

C++에서 sizeof 연산자를 사용하면 구조체 크기가 예상한 멤버 크기의 합보다 큰 경우가 많습니다. 이는 메모리 정렬(alignment)과 패딩(padding) 때문입니다. 본 글에서는 이 현상의 원인과 해결 방법을 살펴보겠습니다.


2. 메모리 정렬과 패딩의 원리

2.1 메모리 정렬이란?

메모리 정렬은 CPU가 데이터를 더 효율적으로 읽고 쓰기 위해, 데이터를 특정 바이트 경계에 맞춰 배치하는 방식입니다.
예를 들어, 4바이트 정수는 주소가 4의 배수로 정렬되면 CPU가 한 번의 읽기로 데이터를 처리할 수 있습니다.

2.2 구조체에서의 패딩

구조체의 멤버는 메모리 정렬을 만족하기 위해 사이에 패딩(추가 공간)이 삽입됩니다. 다음은 예시입니다:

struct Example {
char a; // 1 byte
// 3 bytes padding
int b; // 4 bytes
};

위 구조체의 크기는 sizeof(Example) = 8입니다. char는 1바이트이지만, int가 4바이트 정렬을 요구하므로 3바이트 패딩이 추가됩니다.


3. 정렬 방식에 따른 구조체 크기 비교

아래는 32비트 시스템에서의 예제입니다:

struct X {
short s; // 2 bytes
// 2 bytes padding
int i; // 4 bytes
char c; // 1 byte
// 3 bytes padding
};

구조체 X의 크기는 12바이트입니다. 각 멤버의 정렬 요구 사항에 따라 패딩이 추가되었습니다.


4. 최적화 방법

4.1 멤버 순서 조정

구조체 멤버를 크기 순으로 정렬하면 패딩을 줄일 수 있습니다.
예를 들어, 다음과 같이 멤버를 정렬합니다:

struct Optimized {
int i; // 4 bytes
short s; // 2 bytes
char c; // 1 byte
// 1 byte padding
};

sizeof(Optimized) = 8로 줄어듭니다.

4.2 #pragma pack 사용

컴파일러의 #pragma pack 지시어로 패딩을 최소화할 수 있습니다. 하지만, 성능 저하와 CPU 예외 발생 가능성을 유의해야 합니다.

#pragma pack(1)
struct Packed {
char a; // 1 byte
int b; // 4 bytes
};
#pragma pack()

5. 결론

구조체 크기가 예상보다 큰 이유는 메모리 정렬과 패딩 때문입니다. 멤버 정렬 최적화와 #pragma pack을 활용하여 크기를 줄일 수 있지만, 성능 저하와 호환성 문제를 고려해야 합니다. 이러한 원리를 이해하면 더 효율적인 코드 작성이 가능합니다.

 

Reference

https://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member

저작자표시 비영리 변경금지 (새창열림)
  1. 1. 문제 개요
  2. 2. 메모리 정렬과 패딩의 원리
  3. 2.1 메모리 정렬이란?
  4. 2.2 구조체에서의 패딩
  5. 3. 정렬 방식에 따른 구조체 크기 비교
  6. 4. 최적화 방법
  7. 4.1 멤버 순서 조정
  8. 4.2 #pragma pack 사용
  9. 5. 결론
  10. Reference
'C' 카테고리의 다른 글
  • [C/C++] C언어에서 배열 Decay란? 포인터 변환의 원리와 주의사항
  • [C/C++] scanf()에서 개행 문자 문제 해결하기: C언어 초보자를 위한 가이드
  • [C/C++] 문자열 리터럴은 어디에 저장될까? 메모리와 연관해서 알아보자!
  • [C/C++] C 언어에서 malloc() 결과 형변환, 정말 필요할까?
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 코드업
  • 수학
  • 최소공배수
  • c++
  • 최대공약수
  • 유클리드 호제법
  • C

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[C/C++] C++ 구조체 크기가 예상보다 큰 이유: 메모리 정렬과 패딩의 비밀
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.