[C/C++]바이트 패딩 (Byte Padding)
바이트 패딩(Byte Padding)이란 클래스 (구조체)에 바이트를 추가해 CPU접근에 부하를 덜어주는 기법
padding 의 사전적 정의 : (형체를 잡기 위해 안에 대는) 속, 충전재
구조체나 클래스의 크기는 내부에 선언된 변수들의 크기로 결정된다고 생각되지만 실제 크기를 확인해 보면 대부분 내부에 선언된 변수 크기보다 더 큰 크기의 공간이 할당되어 있다. 이는 CPU접근을 용이하게 만들기 위한 것인데 32bit CPU는 한 번에 4byte를 읽을 수 있고 64bit CPU는 한 번에 8byte를 읽을 수 있다. 만약 int(4byte)자료형 사이에 char(1byte)자료형이 끼어 있다면 패딩이 없을 경우 CPU는 1byte로 인한 격차로 인해 2번의 연산을 수행하게 된다.
이처럼 CPU의 연산 낭비를 막기 위한 기법을 바이트 패딩이라 한다.
#include <stdio.h>
struct temp
{
int a; // 4byte
int b; // 4byte
char c; // 1byte
char d; // 1byte
double e; // 8byte
short f; // 2byte
};
int main()
{
printf("구조체 temp의 크기 : %d \\n", sizeof(temp)); // 32byte
}
위의 예제 파일을 실행시켜보면 구조체의 크기가 32byte가 나온다.
실질적으로 temp 구조체 안에 있는 변수는 int형 (4byte) 2개, char형(1byte) 2개, double형(8byte) 1개, short형(2byte) 1개로 총 선언되어있는 멤버 변수들의 크기는 (4+4+1+1+8+2)로 총 20byte임에도 실제 크기는 32가 나온다.
실질적으로는 위와 같이 padding이 들어가 있어 총 32byte라는 크기가 나오게 되는 것이다.
32bit CPU를 예로 들었을 때 위와 같이 마지막 1byte가 남게 되어 연산을 2번 처리해야 하지만 패딩 바이트를 추가하여 한 번의 연산에 하나의 값이 들어가게 되고 메모리는 더 사용하지만 CPU는 한 번의 동작만 하면 되기에 연산이 보다 빠르게 처리가 된다.
패딩 바이트를 고려하여 위 코드를 효율적으로 사용하려면 배치를 조정해야한다.
#include <stdio.h>
struct temp {
double e; // 8byte
int a; // 4byte
int b; // 4byte
char c; // 1byte
char d; // 1byte
short f; // 2byte
};
void main() {
printf("구조체 temp의 크기 : %d\\n", sizeof(temp)); // 24byte
}
별 차이 나지 않겠지 하며 대수롭게 여기기보다는 개발자라면 패딩 바이트는 최소한으로 생성되도록 유도하는 것이 필요하다.
가장 큰 byte를 소모하는 자료형이라면 되도록 가장 위에 선언해 주어 불필요한 메모리 낭비를 줄이는 것이 좋다.
출처 : 코딩팩토리블로그
'Programming > C, C++' 카테고리의 다른 글
C++ Static 정적 클래스, 정적 멤버, static 변수, static함수 (0) | 2022.12.20 |
---|---|
C++ 구조체와 클래스의 코드로보는 차이점 (0) | 2022.12.20 |
C++ 구조체 (structure type) (0) | 2022.12.14 |
C++ 파일 입출력 fstream ifstream ofstream (char배열, string) (0) | 2022.12.14 |
C++ 타입(형) 변환 (Type conversion, Type Casting) (0) | 2022.12.14 |