시스템/시스템 공통
구조체 패딩
zeroup
2022. 7. 28. 09:11
대부분의 컴파일러는 구조체를 메모리에 올릴 때 성능 향상을 위해 필드를 일렬로 배치하지 않고 중간중간 빈공간을 두어 cpu가 접근하기 쉬운 위치에 필드를 배치하는 데 이를 구조체 패딩이라고 한다. 그리고 중간 빈 공간에 들어간 것을 패딩 비트라고 한다.
참고로 os 32bit 환경에서는 4byte packing, 64bit 환경에서는 8byte packing 방식을 이용
왜 빠를까?
패딩 비트가 없을 경우 어떤 일이 일어나는지 생각해보자.
cpu는 메모리를 읽어올 때 한 번에 32bit os : 4byte 혹은 64bit os : 8byte를 읽어온다.
class Test
{
char _c1; // offsetof 0, size 1
int _i4; // offsetof 1, size 5
// 1byte packing을 하였다면
};
ex) char 변수 1, int 변수 1이 있는 구조체를 생각해보면, 32 bit os에서는 int 변수를 읽기 위해서 먼저 2~4 byte에 위치한 메모리를 읽어야 한다. 그러므로 cpu는 첫 4byte의 메모리를 읽는다. 그리고 5byte에 위치한 나머지 int의 메모리를 읽기 위해 또 4byte의 메모리를 읽는다.
만약 패딩 비트로 char 뒤에 3byte가 채워져있었다면, int 변수를 읽기 위해 한 번만 메모리를 읽어도 될 것을 2번 읽게 된 것이다. 이런 식으로 구조체 메모리를 정렬해놓으면 쓸데없이 메모리를 읽는 것을 막기 때문에 성능 저하가 발생하지 않는다.
출처 : https://wnsgml972.github.io/c/2019/11/21/c_struct_padding/