본 게시글은 면접준비 및 자기계발을 목적으로 작성된 게시글입니다
공부한 내용을 토대로 남들에게 설명할 수 있도록 이해하는 과정에 작성한 게시글이니 참고바랍니다
구조체나 클래스를 실제로 메모리에 올릴 때, 성능 향상을 위해 추가적인 메모리를 할당하여 끼워 넣는 것
메모리에서 CPU 레지스터로 한번에 읽어오는 데이터의 크기 때문에 패딩이 일어남
CPU가 데이터를 처리할 때 동작 방식이 예를 들어 64bit의 CPU일 때 한 번의 CPU 연산으로 처리하는 최대 데이터의 크기가 64bit(=8byte). 즉, 메모리에 적재된 데이터를 한 번에 8byte까지 처리할 수 있음
CPU가 Memory에 접근할 때는 데이터 관리의 효율을 높이기 위해 Memory를 Block 단위로 관리하는 여러 로직들에 의해서 Block의 단위에 맞는 특정 배수의 번지수로만 접근이 가능함
만약에 아래와 같이 데이터가 블럭에 걸쳐져서 적재될 경우 해당 데이터를 읽는데 2번의 접근이 필요하기 때문에 이는 속도 저하를 발생 시킴
따라서 이러한 특징들로 인해 Memory에 데이터를 적재할 때 일부러 빈 공간을 만들어서 넣는것을 패딩 이라고함
[예시1]
struct Ex{
char a, b;
int x;
};
다음과 같은 경우에 실제 정보는 6바이트(char:1byte, int:4byte)
하지만 메모리에는 8바이트를 차지하게 됨
이는 컴파일러가 자동적으로 CPU가 읽기 쉽게 1워드(4byte, =Block) 단위로 패딩을 넣어 정보를 주는 것
| a | b | - | - | x | x | x | x |
만약 위에서 순서를 바꾸게 되면?
struct Ex{
char a;
int x;
char b;
}
이런 경우엔 1워드에 char 1개, 다음 워드에 int, 다음 워드에 char 하나 들어가게 됨
[예시2]
struct Name //2byte
{
char name[2];
}
이 경우는 패딩이 없음
패딩은 레지스터 단위 접근을 쉽게 하기 위해서 만드는 것인데 다음에 접근할만한 요소가 없기 때문에 2만 차지해도 되기 때문
만약 뒤에 int가 선언 되었다면 2+2(패딩)+4
[예시3]
struct Point
{
short point_x;
int point_y;
};
struct Player
{
char rank;
short hp;
short mp;
Point point;
};
구조체/클래스 패딩은 구조체 안의 가장 큰 자료형의 크기로 정해짐
Point의 제일 큰 타입이 int 이므로 4byte 기준으로 패딩이 잡힘
Player => char+short+1byte(padding) | short+2byte(padding) | Point
효율을 위해서 memory에 아래의 규칙을 적용해서 데이터를 적재함
1. 구조체(클래스)에서 가장 큰 멤버 변수 타입의 크기를 최대 Block으로 계산한다
(배열의 경우 배열 변수 타입을 기준으로 함 ex)int 배열이면 int타입 크기로 계산 )
2. 최대 Block 크기를 기준으로 순차적으로 데이터를 적재하고,
Block의 남은 memory 크기가 변수 타입의 크기를 넘어서면 다음 block에 적재한다
struct s
{
double e; // 8byte
int a; // 4byte
int b; // 4byte
char c; // 1byte
char d; // 1byte
short f; // 2byte
};
개발자라면 패딩 바이트는 최소한으로 생성되도록 유도하는 것이 필요함
char형은 1byte이기에 어디든지 붙을 수 있어 상관 없지만 double형 long long 형과 같은 큰 byte를 소모하는 자료형이라면 될 수 있으면 가장 위에 선언해주어 불필요한 메모리 낭비를 줄이는 것이 현명한 선택
📃 자료형 크기
ㅤㅤㅤㅤ자료형ㅤㅤㅤㅤ ㅤㅤㅤㅤ크기ㅤㅤㅤㅤ ㅤㅤㅤㅤ자료형ㅤㅤㅤㅤ ㅤㅤㅤㅤ 크기ㅤㅤㅤㅤ char 1byte long long 8byte short 1byte float 4byte int 4byte double 8byte long 4byte long double 8byte
📚 참고출처
얌얌코딩 (게임 개발) : https://youtu.be/D-STWJ24Kcs?si=SchohSwV6LRH3nZv
껍데기방 : https://husk321.tistory.com/265
IT는 뭐하는 곳일까 : https://hackerpark.tistory.com/entry/CC-구조체클래스-패딩-struct-class-padding
조규진의 스터디 블로그 : https://chogyujin-study.tistory.com/94?category=1034072