[C/C++] 구조체의 크기에 관해서..
퇴사후 휴식을 하고 잊어버린 C++을 ... 다시 공부하려고 하는데(진짜 다 잊어버려서 내가 당황스럽다..)
허리가 너무 아파서 겨우겨우 허리 잡으며 하나하나 정리라도 하면서 잊어버린거 혹은 그냥 생각나는대로 뭐라도 옮겨 적으려고 한다 -_-..
블로그 API도 종료되서 매우매우 캡쳐 뜨기도 귀찮기는 하지만.....
이번에 적을것은 구조체 선언시 문제(?)가 될 수 있는 것이다.
소스코드는 아래와 같다.
#include <iostream>
struct MyStruct1 { int a; char b; double c; short d; }; struct MyStruct2 { char a; short b; int c; double d; }; struct MyStruct3 { }; int main() { MyStruct1 s1; MyStruct2 s2; MyStruct3 s3; std::cout << sizeof(s1) << std::endl; std::cout << sizeof(s2) << std::endl; std::cout << sizeof(s3) << std::endl; return 0; }
결과
내가 예상했던 결과는
20
16
1
이었는데...
24
16
1
이렇게 나와 버렸다.
먼저 나는 4byte씩 공간을 잡는다는 생각으로.
위의 코드에서 MyStruct1을 보면.
struct MyStruct1 { int a; //4 ■ ■ ■ ■ char b; //4 ■ □ □ □ double c; //8 ■ ■ ■ ■ ■ ■ ■ ■ short d; //4 ■ ■ □ □ };
위의 주석과 같이 4+4+8+4 해서 20byte를 먹는줄 알았는데..
double인 8byte가 있어서 기준이 되는 크기가 4byte가 아닌 8byte가 되어버렸다.
struct MyStruct1 { int a; //4 ■ ■ ■ ■ // ■ ■ ■ ■ char b; //4 ■ □ □ □ // ■ ■ ■ ■, ■ □ □ □ double c; //8 ■ ■ ■ ■ ■ ■ ■ ■ // ■ ■ ■ ■, ■ □ □ □, ■ ■ ■ ■, ■ ■ ■ ■ short d; //4 ■ ■ □ □ // ■ ■ ■ ■, ■ □ □ □, ■ ■ ■ ■, ■ ■ ■ ■, ■ ■ □ □, □ □ □ □ };
길게 표현되다보니 줄이 길어졌는데
저렇게 공간을 잡게 되어서 24byte가 나오게 되었다.
두번째 구조체인 MyStruct2는 아래와 같이...
struct MyStruct2 { char a; //1 ■ □ □ □ short b; //2 ■ ■ □ □ int c; //4 ■ ■ ■ ■ double d; //8 ■ ■ ■ ■ ■ ■ ■ ■ };
첫번째와 두번째로 선언한 char와 short가 총 3byte이므로 4byte한 공간에 들어가게 되고 int c는 4byte이므로
a,b,c는 총 7byte를 잡아먹는다. d가 double형이므로 8byte가 되어서
8byte 2개의 공간을 잡게되어서 실질적으로는 7+8 byte이지만
공간은 8+8 byte인 16byte로 잡게 되었다.
내가 이런것도 잊어버리다니...ㅠㅠ