공부중
[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로 잡게 되었다.
내가 이런것도 잊어버리다니...ㅠㅠ
'Programing > C, C++' 카테고리의 다른 글
[C++]범위 기반 for문(Range-based for loop) (0) | 2018.05.25 |
---|---|
[C++] 2진수 입력 방법과 어퍼스트로피 (0) | 2018.05.25 |
[C/C++] 상속관계에서의 함수 Call (0) | 2015.11.01 |
[C/C++] Bit연산을 이용한 아이템 장착 유무 관리 및 판별 (0) | 2015.10.31 |
[C]배열선언 시 배열크기에 변수가 들어가도 동작한다? (1) | 2015.09.15 |