일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- winapi
- 줄 세우기
- UnrealEngine4
- 언리얼엔진5
- Frustum
- 티스토리챌린지
- directx
- algorithm
- NRVO
- 백준
- UnrealEngine5
- IFileDialog
- DeferredRendering
- DirectX11
- Unreal Engine5
- softeer
- 1563
- baekjoon
- 프로그래머스
- Programmers
- RootMotion
- 팰린드롬 만들기
- RVO
- C++
- 2294
- GeeksForGeeks
- 오블완
- const
- UE5
- C
- Today
- Total
Game Develop
[C++] 구조체크기 계산. 본문
https://dobby-the-house-elf.tistory.com/358
친절한 설명은 이미지가 포함되어있는 위 글에서..
기본적으로, 최종 크기는 가장 큰 데이터타입의 배수이다.
기본적으로 여러데이터타입이 있을 경우, 가장 큰 것을 기준으로 한다.
그렇다고 가장큰 것 * 변수개수가 아니다!
각각 데이터크기 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가 된다.
'C++ > C++' 카테고리의 다른 글
[C++] 클래스와 구조체 차이점 (0) | 2023.10.26 |
---|---|
[C++] Tail Call Optimization, Tail Recursive Elimination (0) | 2022.12.27 |
[C++] std::sort에 관하여 (0) | 2022.12.27 |
[C++] 크기가 큰 멤버변수를 읽어들일 때 참조자 활용도 고려 (0) | 2022.11.29 |
[C++] const객체는 마음대로 멤버함수를 호출할 수 없다. (1) | 2022.11.29 |