-
C++ 구조체, 클래스 패딩쾌락없는 책임 (공부)/C++ 짜잘이 2022. 1. 24. 23:37반응형
구조체 패딩?
위 코드에서 Ex1, Ex2 는 들어있는 정보량이 같은데 각 구조체별 사이즈를 찍어보면 Ex1은 32바이트, Ex2는 24바이트가 나오게 됩니다. 구조체가 한두개라면 모를까 기본제공 타입처럼 많이 사용한다면 1개당 적어도 8바이트의 손실이 일어날 것입니다.
위와같은 현상이 나타나는 이유는 바로 패딩(Padding) 때문입니다. CPU가 메모리에 접근해서 읽을때 1워드 단위로 읽게 됩니다. 32비트의 경우 4 바이트, 64비트의 경우 8 바이트를 읽게 됩니다. 그리고 이렇게 읽는 방식때문에 구조가 달라지게 됩니다.
struct Ex{ char a, b; int x; };
예시로 이런 구조체가 있다고 하면 실제 정보는 6 바이트지만 메모리에는 8바이트를 차지하게 됩니다.
a b x x x x 각 칸을 1바이트라고 하면 위에처럼 담긴다고 생각하지만
a b - - x x x x 이렇게 들어간다는 이야기입니다. 이는 컴파일러가 자동적으로 패딩을 넣어주는 경우로 CPU가 읽기 쉽게 1워드(4바이트) 단위로 정보를 주는 것입니다.
그런데 만약 위에서 순서를 바꾼다면?
struct Ex{ char a; int x; char b; };
이러면 무려 12바이트를 차지하게 됩니다. 1워드에 char 하나, 다음 워드에 int, 다음 워드에 char 하나 들어가는 것이죠.
이런 패딩을 잘 관리하기 위해서는
일단 구조체가 한두개 쓰인다면 큰 영향이 아니지만 여러개 사용된다면 이런걸 주의해서 설계를 해야 합니다.
- 구조체의 용량은 구조체 내 가장 큰 데이터 타입의 배수가 된다.
- 구조체 선언 순서대로 메모리에 들어가게 된다.
- word 단위로 넣는다는 생각으로 정렬을 하자.
위 3가지를 잘 생각해서 최소한으로 만들 수 있는 데이터 용량을 생각해서 만들어 두는게 좋습니다. 항상 말이죠.
반응형'쾌락없는 책임 (공부) > C++ 짜잘이' 카테고리의 다른 글
C++ make_pair vs {} (0) 2022.03.06 C++ fill_n vs memset, 무슨 차이가 있을까 (0) 2022.02.28 C++ pimpl과 관련한 이야기들 (0) 2022.02.16 C++ 에서 증감 연산자 오버로딩, 전위, 후위 연산자를 구별하는 방법 (0) 2022.01.11 cout 과 문자열 포인터 (0) 2021.12.27