C++

ClassBytePadding(바이트패딩)

Nin 2020. 12. 22. 15:16
#include <iostream>

class Test
{
public:
   int a;
   char b;
};

int main()
{
   std::cout << sizeof(Test);
}

위의 코드를 예상하면 Test의 크기는 

int형 1개 = 4바이트

char형 1개 = 1바이트

해서 5바이트가 나올거라고 예상할 수 있지만 실제로 sizeof를 해보면

8바이트가 나온다. 이를 바이트 패딩이라고 하는데

사용자 정의 자료형 내부의 가장 큰 바이트를 기준으로 바이트 크기를 정하는것을 말한다.


public:
   int a;
   char b;
   char c;

만약에 위와 같이 int 1개 char 2개가 있다고 하면 역시 8바이트가 나온다

char형이 1바이트니깐 두개를 묶어서 계산하는 것이다.


public:
   int a;
   char b;
   char b1;
   char b2;
   char b3;
   char b4;

이렇게 했을 경우에 int a 와 char b~b3까지 4개를 묶어서 총 8바이트로 계산하고

char b4가 남았으니 12바이트가 되는것이다.


public:
   int* a;
   char b;
   char b1;
   char b2;
   char b3;
   char b4;

이렇게 할경우 int* a가 8바이트이기 때문에 16바이트가 나온다.


class TestClass
{
};

int main()
{
   std::cout << sizeof(TestClass);
}

그렇다면 이 TestClass의 사이즈는 몇일 나올까?

답은 1이 나온다.메모리가 0인 크기는 존재할 수 없다.

크기가 0이라면 포인터와 배열을 사용할 때 문제가 생긴다.


int main()
{
   TestClass Arr[10];
   Arr[1];
   Arr[2];
   Arr[3];
}

메모리가 0인 크기가 존재한다면

만약 Arr의 주소가 100번지라고 가정하면 

Arr[1],Arr[2],Arr[2] 모두가 100번지이게 되는거고 말이 안되기 때문이다.

포인터 역시 더하기 연산에서 크기가 0이면 몇을 더하든 

주소값이 똑같기 때문에 의미가 사라진다.