초보 코린이의 성장 일지

C++ Byte Padding 본문

개인 공부

C++ Byte Padding

코오린이 2024. 4. 22. 19:46

Byte Padding 설명

  • 바이트 패딩(byte padding)은 구조체(struct)나 클래스(class)의 멤버 변수들이 메모리에 배치될 때, 메모리 정렬(align)을 위해 추가적인 바이트가 삽입되는 현상을 말한다.
  • 구조체나 클래스에 바이트를 추가해 CPU 접근에 부하를 덜어주는 기법이다.
  • CPU가 32비트에서는 한번에 4바이트. 64비트에서는 한번에 8바이트를 읽을 수 있다.
#include <iostream>

using namespace std;

struct TestStruct
{
	char a; // 1바이트
	int b; // 4바이트
	char c; // 1바이트
	float d; // 4바이트
};

class TestClass
{
	short a; // 2바이트
	char b; // 1바이트
	int c; // 4바이트
	short d; // 2바이트
	char e; // 1바이트;
};

int main()
{
	cout << "구조체 TestStruct의 크기 : " << sizeof(TestStruct) << "bytes" << endl;
	cout << "클래스 TestClass의 크기 : " << sizeof(TestClass) << "bytes" << endl;
}

 

1. 효율적인 메모리 사용을 위해 대부분 시스템에서는 정해진 바이트안에 위치하는 것이 좋다.

2. byte padding을 통해 각 멤버변수 간의 간격을 조절해준다.

3. 변수들을 보면 자료형이 제일 큰 int나 float의 기준이 되어 4byte로 빈 공간에 byte padding이 들어가게 된다.

4. byte padding이 일어나면 앞뒤에 있는 자료형과 큰 자료형이 기준점이 되어 부족한 byte를 채워줌으로써 원래에 생각하던 byte가 아닌 padding된 byte 결과를 볼 수 있다.

5. 위 그림 예시를 보면 short와 char이 순서대로 변수선언이 되어있다고 했을 때, 둘의 합이 3byte기 때문에 int의 자료형 byte를 따라 1byte만 채워준다 이럴때는 묶어서 byte를 채우게된다.

#include <iostream>

using namespace std;

struct TestStruct
{
	char a; // 1바이트
	char b; // 1바이트
	int c; // 4바이트
	float d; // 4바이트
};

class TestClass
{
	short a; // 2바이트
	char b; // 1바이트
	short c; // 2바이트
	int d; // 4바이트
	char e; // 1바이트;
};

int main()
{
	cout << "구조체 TestStruct의 크기 : " << sizeof(TestStruct) << "bytes" << endl;
	cout << "클래스 TestClass의 크기 : " << sizeof(TestClass) << "bytes" << endl;
}

 

1. 위에있는 표와 다르게 변수 위치가 조정되어있어 자료형 크기가 변화되는걸 확인할 수 있다.

2. 위에 있는 표와 비교해보면 중간에 비어있는 byte의 간격이 짧아 byte padding을 했을 때 byte가 줄어들거나 늘어나는걸 확인할 수 있다.

 

결론 : Struct, Class에서 멤버변수들을 선언할 때 byte Padding을 고려하여 메모리를 효율적으로 사용하기 위해서는 자료형이 큰 멤버변수를 맨 아래에 선언하거나 중간에 byte를 계산해서 선언하는 방법이 좋다.

'개인 공부' 카테고리의 다른 글

C++ Casts  (0) 2024.04.11
짐벌락 (GimBal Lock)  (2) 2023.09.27
C++ Static  (0) 2023.07.27
C++ malloc, free, new, delete 차이  (0) 2023.07.25
C++ Extern  (0) 2023.07.21
Comments