구조체의 멤버 변수를 정렬하는 것만으로도 구조체의 크기가 달라진다는 거 아시나요? 아래와 같이 구조체에 여러 타입들을 섞어서 썼을 경우 구조체 사이즈를 알아보겠습니다.
struct StructNonSorted { bool bool1; int int1; int int2; bool bool2; char char1; int int3; char char2; int int4; char char3; int int5; bool bool3; int int6; bool bool4; };
다음은 타입별로 멤버 변수를 정렬시켰을때의 구조체 크기를 살펴 보겠습니다.
struct StructSorted { bool bool1; bool bool2; bool bool3; bool bool4; char char1; char char2; char char3; int int1; int int2; int int3; int int4; int int5; int int6; };
무려 16이나 차이가 납니다. 왜이런 차이가 생길까요? VisualStudio C++의 경우 컴파일러 기본 옵션에 구조체 멤버 정렬 옵션(/Zp)이 8바이트로 정렬됩니다. 그래서 맨 처음 보여드린 구조체와 같이 정렬 되지 않은 상태인 경우 아래와 같이 중간에 패딩이 들어가게 됩니다. 그러면 그만큼 공간 낭비가 되고, 구조체의 크기가 커지게 되는 것이죠.
반대로 구조체를 크기 별로 정렬을 하면, 아래와 같이 8바이트 공간 안에 알차게 데이터가 들어가게 됩니다. 공간 낭비가 줄어들고, 그 만큼 구조체의 크기는 작아지게 되는 것이죠. 구조체의 크기가 작아지고 변수들이 정렬 되어있으면 메모리 친화적이게 되고, 캐싱 적중률도 높아지게 됩니다.
반응형
'프로그래밍' 카테고리의 다른 글
The Modernest C++ #1 - 템플릿 메타프로그래밍 (Template Metaprogramming) (5) | 2015.10.07 |
---|---|
The Modernest C++ #0 - 시작하며 (4) | 2015.10.06 |
차세대 그래픽 API (0) | 2015.02.24 |
실시간 그림자를 싸게 그리자! 평면상의 그림자 ( Planar Shadow) (4) | 2015.02.23 |
템플릿 특수화 ( Template Specialization ) (2) | 2015.02.05 |