

컴파일러가 구조체의 멤버 변수 사이나 마지막에 성능 향상을 목적으로 삽입하는 의미 없는 빈 공간
하는 이유: CPU가 메모리에서 데이터를 읽을 때, 4 또는 8바이트 단위로 정렬된 주소에서 읽는 것이 가장 빠르기 때문
32bit체제에선 4byte씩, 64bit체제에선 8byte씩 메모리에서 읽는것이 빠름
성능을 위해 메모리가 조금 낭비된다는 단점이 존재
멤버 변수 중 가장 큰 '정렬 기준(Alignment)' 찾기
구조체 전체의 정렬 기준은 내부 멤버 중 가장 큰 자료형의 크기를 따르게 됨
멤버를 순서대로 배치하며 '중간 패딩' 넣기
각 멤버는 자기 자신의 크기(또는 정렬 기준)의 배수인 주소에서 시작해야 함
마지막에 '꼬리 패딩' 추가하기
모든 멤버를 다 배치한 후, 전체 크기가 Step 1에서 찾은 기준의 배수가 되도록 채움
struct Bad {
char a;
double b;
int c;
};
a . . . . . . .
b b b b b b b b
c c c c . . . .
총 24byte를 차지하게 됨
struct Good {
double b;
int c;
char a;
};
b b b b b b b b
c c c c a . . .
총 16byte를 차지
struct A
{
char c;
int* a;
};
만약 32bit체제의 경우 포인터 자료형은 4byte의 크기를, 64bit체제의 경우 8byte의 크기를 가지게 됨
따라서 A의 크기는 전자의 경우 8byte, 후자의 경우 16byte
struct Vector3 {
double x;
double y;
double z;
};
struct Character {
int id;
Vector3 position;
};
객체 안의 객체가 있으면, 안에 들어있는 객체의 멤버변수까지 포함해서 가장 큰 자료형을 찾고 기준으로 삼는다
Vector3 객체에서 double이 가장 크므로 8byte를 기준으로 함
따라서 32byte를 차지
struct Patient {
string name;
int priority;
int age;
int id;
};
vector나 string이나 C++에서 제공하는 STL 객체는 크기가 컴파일러마다 다름
과거에 작성한 velog내용처럼 우리가 실제 사용하는 원소(벡터) / 문자(string)은 힙에 존재함
그리고 이 힙을 가리키면서 메모리를 관리해주는 메타데이터가 스택에 존재하는데, 이 크기가 다름
MSVS(Visual Studio)에서 string은 40byte이고, 정렬기준은 8byte

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