프로그래밍/공부

[C++] 바이트 패딩

Sik.K 2023. 4. 20. 15:49

바이트 패딩(Byte Padding)

 

클래스 혹은 구조체에 바이트를 추가해 CPU에 가해지는 부하를 줄여주는 기법. CPU는 연산을 할 때 레지스터에 데이터를 담아서 연산을 한다. 이 레지스터는 x86 CPU에서는 32비트, x64 CPU에서는 64비트로 이뤄져 있는데 이 크기를 바이트로 환산하면 각각 4바이트 8바이트가 된다.

 

만약 다음과 같은 클래스가 있다고 가정해보자.

 

class Basic
{
    int a;
    bool b;
    int c;
}

 

위 클래스의 메모리 구조는 int bool int의 연속된 공간이다.

구조는 대략 위와 같다.

 

이 클래스를 컴퓨터가 읽어올 때, 레지스터에 담게 될 경우, 32비트 코어에서는 4바이트 씩 끊어서 읽게 된다. 이 경우 첫 번째 int 변수를 읽을 때는 문제가 없지만 다음 변수를 읽을 때 문제가 생긴다.

 

bool형의 크기는 1바이트로 되어 있다. 이 때문에 이 변수를 읽기 위해 레지스터의 공간에 할당하게 되면 뒤에 위치한 int의 데이터의 일부가 같이 읽히게 된다.

 

따라서 세 번째 위치한 int의 데이터를 완전히 읽기 위해서 데이터를 2번을 읽어야 하는 불상사가 생기게 된다. 이 때문에 메모리를 읽는 횟수가 증가하게 되고 연산의 속도가 느려진다.

 

이런 상황을 방지하기 위해 bool형 자료 뒤에 필요없는 공간 3바이트를 채워줌으로 써 마지막 int 자료형을 읽을 때 한 번에 자료를 읽게 할 수 있다.

 

 

이렇게 붉은 공간처럼 빈 공간을 만들어 줌으로 써 CPU의 가해지는 부하를 줄여줄 수 있다.