프로그래밍/Note

클래스의 크기

hscho00 2020. 6. 23. 16:53

수업 중 구조체의 크기에 관한 내용이 있어 정리

 

구조체(or클래스)로 만들어진 데이터 형의 크기는 해당 구조체를 구성하고 있는 멤버 변수들의 크기를 합한 것이라고 배웠지만,

Visual C/C++ 에서는 구조체 멤버 맞춤(Struct member alignment)가 적용되어 구조체 선언 시에 데이터 형을 어떻게 배열했는지에 따라서 그 크기가 달라질 수 있다

(속성 > C/C++ > 구조체 멤버 맞춤, 에서 확인 가능)

 

자세한 규칙은 링크를 참고

 

 

간단하게 따지면 해당 구조체의 멤버 변수 중 가장 크기가 큰 멤버 변수를 기준으로 삼는다는 점

 

virtual 키워드가 들어가면 가상테이블을 참조할 포인터가 필요하기 때문에 더 늘어난다는 점

 

멤버 함수는 메모리 레이아웃에 포함되지 않는다는 건 잘 아실테고... (코드 섹션에 들어감)

 

 

ex)

멤버 변수로 char, char, int => 8바이트

멤버 변수로 char, char, int + virtual 함수 => 12바이트

 

멤버 변수로 char, char => 2바이트

멤버 변수로 char, char + virtual 함수 => 8바이트 (포인터 크기 4바이트를 기준삼는 듯하다)

 

멤버 변수로 char, char, double => 16바이트

멤버 변수로 char, char, double + virtual 함수 => 24바이트

> 까보진 않았지만 가장 앞이 가상테이블 주소 (이 과정에서 가장 큰 크기의 멤버변수 double 바이트만큼 할당)

> 뒤로 붙는 멤버 변수는 크기가 작더라도 새로 할당에서 쓰나보다

 

멤버 변수로 double, double => 16바이트

멤버 변수로 double, double + virtual 함수 => 24바이트


참고)

 

https://blog.naver.com/tipsware/221090063784

 

클래스의 크기

: C++ 언어 관련 전체 목차 http://blog.naver.com/tipsware/2210285599031. C 언어에서 구조체로 정의한...

blog.naver.com

https://blog.naver.com/tipsware/100161717624

 

Struct member alignment 에 대한 검증

C/C++ 프로그래머들이 많이 사용하는 구조체는 매우 유용한 사용자 정의 데이터형(Data Type) 입니다. ...

blog.naver.com