Game Develop

[C++] 구조체크기 계산. 본문

C++/C++

[C++] 구조체크기 계산.

MaxLevel 2024. 2. 22. 21:48

https://dobby-the-house-elf.tistory.com/358

 

[C++] 구조체의 크기 (size of struct)

구조체의 크기는 구조체를 구성하는 요소들에 의해 정해 집니다. 하지만 크기를 출력해보면 예상한 값과 다르게 나올때가 있는데, 그 이유와 구조체의 구조에 대해 알아보겠습니다. struct Packet00

dobby-the-house-elf.tistory.com

친절한 설명은 이미지가 포함되어있는 위 글에서..

 

기본적으로, 최종 크기는 가장 큰 데이터타입의 배수이다.

 

기본적으로 여러데이터타입이 있을 경우, 가장 큰 것을 기준으로 한다.

그렇다고 가장큰 것 * 변수개수가 아니다!

 

각각 데이터크기 1, 2, 4 (char, short, int) 가 있으면

일단 할당받을 메모리블럭크기는 4의 배수다.

 

먼저 첫 번째 4바이트짜리 메모리블럭에 1,2가 들어가니까 result +=4를 한다.

마지막 4도 메모리블럭에 들어가니까 result +=4 해서 최종적으로 총 할당받을 메모리크기는 8바이트다.

 

만약 1,4,2 ?

위의 예시와 순서만 바뀌었을 뿐이지만, 결과는 다르다.

마찬가지로 할당받을 메모리블럭은 가장 큰 4의 배수이다.

먼저 첫 번째 4짜리메모리블럭으로 1은 담을 수 있지만, 추가적으로 4는 못담는다. (1 + 5 > 4)

그렇기 때문에 1을 담고, 추가적인 4짜리메모리블럭으로 4를 담아야 한다.

이렇게 로직이 진행되기 때문에 위의 예시와 달리 8바이트가 아닌 12바이트가 필요하다.

 

1,2,4,4 = > 12바이트. (4하나로 1,2담기가능. 이후 각각 4,4)

 

1,4,4 => 12바이트

 

1,1,1 => 3바이트. (가장큰게 1바이트니까)

 

1,2 = > 4바이트

 

1,8,8 => 24바이트. 고작 1바이트담는것일 뿐이지만, cpu처리 효율을 위해 8바이트짜리 메모리블럭을 사용해야 한다.

 

 

구조체 안에 구조체가 담기는 경우도 있을 것이다.

 

struct Packet1 { 1, 2 }; => 4

struct Packet2 { 1, 8, 8}; => 24

struct Packet3 { packet1, packt2 } => ???

 

이 경우, 마찬가지로 각 구조체의 변수크기들 중 가장 큰 것을 기준으로 한다.

packet1 packet중 가장 큰 건 8이니, 8단위로 할당.

8크기의 메모리블럭으로 packet1의 메모리블럭을 커버가능하니 하나 써준다. result += 8

이후 packet2의 각 변수마다 8을 할당. result += 8 * 3;

최종적으로 result == 32가 된다.