Padding

김펭귄·2026년 4월 22일

Today What I Learned (TIL)

목록 보기
112/139

1. Padding

사진 출처

  • 컴파일러가 구조체의 멤버 변수 사이나 마지막에 성능 향상을 목적으로 삽입하는 의미 없는 빈 공간

  • 하는 이유: CPU가 메모리에서 데이터를 읽을 때, 4 또는 8바이트 단위로 정렬된 주소에서 읽는 것이 가장 빠르기 때문

  • 32bit체제에선 4byte씩, 64bit체제에선 8byte씩 메모리에서 읽는것이 빠름

  • 성능을 위해 메모리가 조금 낭비된다는 단점이 존재

1.1. 패딩하는 법

  1. 멤버 변수 중 가장 큰 '정렬 기준(Alignment)' 찾기
    구조체 전체의 정렬 기준은 내부 멤버 중 가장 큰 자료형의 크기를 따르게 됨

  2. 멤버를 순서대로 배치하며 '중간 패딩' 넣기
    각 멤버는 자기 자신의 크기(또는 정렬 기준)의 배수인 주소에서 시작해야 함

  3. 마지막에 '꼬리 패딩' 추가하기
    모든 멤버를 다 배치한 후, 전체 크기가 Step 1에서 찾은 기준의 배수가 되도록 채움

1.2. 예시 (64bit 운영체제)

  • 먼저 64bit운영체제이므로 8byte가 메모리에서 한 줄을 차지하게 됨
struct Bad {
    char a;     
    double b;   
    int c;      
}; 
  • double이 8byte로 가장 큼. 따라서 8byte가 기준이 됨
a . . . . . . . 
b b b b b b b b
c c c c . . . .
총 24byte를 차지하게 됨
struct Good {
    double b;    
    int c;      
    char a;     
}; 
  • 마찬가지로 8byte가 기준이나, 변수 순서가 달라짐
b b b b b b b b 
c c c c a . . .
총 16byte를 차지
  • 그래서 가장 큰 멤버변수를 앞에 놓고 나머지 작은 변수들을 뒤에 모아놓는 것이 메모리적으로 효율적

1.3. 운영체제 마다 다른 예시

struct A
{
	char c;
	int* a;
};
  • 만약 32bit체제의 경우 포인터 자료형은 4byte의 크기를, 64bit체제의 경우 8byte의 크기를 가지게 됨

  • 따라서 A의 크기는 전자의 경우 8byte, 후자의 경우 16byte

1.4. 객체 안의 객체 예시

struct Vector3 {
    double x; 
    double y; 
    double z; 
};

struct Character {
    int id;          
    Vector3 position; 
};
  • 객체 안의 객체가 있으면, 안에 들어있는 객체의 멤버변수까지 포함해서 가장 큰 자료형을 찾고 기준으로 삼는다

  • Vector3 객체에서 double이 가장 크므로 8byte를 기준으로 함

  • 따라서 32byte를 차지

1.5. STL을 포함하는 객체 예시

struct Patient {
    string name;
    int priority;
    int age;
    int id;
};
  • vectorstring이나 C++에서 제공하는 STL 객체는 크기가 컴파일러마다 다름

  • 과거에 작성한 velog내용처럼 우리가 실제 사용하는 원소(벡터) / 문자(string)은 힙에 존재함

  • 그리고 이 힙을 가리키면서 메모리를 관리해주는 메타데이터가 스택에 존재하는데, 이 크기가 다름

  • MSVS(Visual Studio)에서 string은 40byte이고, 정렬기준은 8byte

  • 따라서, 8byte를 기준으로 string이 40byte에다가 int 3개에 padding까지 들어가서 56byte를 차지

profile
반갑습니다

0개의 댓글