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이면 몇을 더하든
주소값이 똑같기 때문에 의미가 사라진다.