본문 바로가기
개발/C++

C++ 클래스 메모리 할당 정리

by 민돌이2 2021. 12. 27.

면접때 틀렸던 질문이였다.

class A { public: A(); virtual ~A(); private: int a; char b; float c; double d; };

A 클래스의 메모리 구조를 그려보라고 했었다.

64bit 환경에서 int는 4byte, char는 1byte, float은 4byte, double은 8byte니 4 + 1 + 4 + 8 = 17이지만 4byte씩 하기에 char 뒤의 3byte는 패딩으로 되어 20byte이고, 가상 소멸자는 컴파일 시 생성되는게 아니기에 가상 함수 포인터에 대해서 설명 좀하고 메모리를 차지 하지 않을 것 같은데? 해서 20byte라고 했었다.

 

하지만 정답은 32byte다.

패딩 크기는 클래스 멤버 중 가장 큰 멤버 기준으로 잡는다.

int, char, float, double, 포인터 중 가장 큰 것은 포인터와 double로 8byte이다. 처음 가상 소멸자로 8byte, int + char 해서 5byte 할당하고 3byte 건너 뛰고 float 4byte할당 하고 4byte 건너 뛰고, double 8byte 해서 8 + 5 + 3 + 4 + 4 + 8  = 32byte

클래스 메모리 구조

 

 

정리

1.메모리의 기본 단위는 자료형 기준 가장 큰 값을 기본단위로 할당 함.

int a; char b;

위 코드의 자료형 기준 가장 큰 값은 4byte로 int이다. 그러므로 전체 메모리 크기는 8byte가 된다.

double a; char b;

위 코드의 자료형 기준 가장 큰 값은 8byte로 double이다. 그러므로 전체 메모리 크기는 16byte가 된다.

포인터 또한 예외가 아니다.

 

2.선언한 순서대로 메모리가 쌓임.

이 말은 변수 선언 순서도 생각해서 짜야한다는 것이다.

int a; char b; float c; char d;

위 코드의 메모리 구조는 16byte이지만,

int a; char b; char d; float c;

위 코드는 12byte이다.

 

또한 멤버 초기화 리스트에서도 순서대로 해야 효율적이라고 하는 것도 연관지어서 생각할 법하다.

선언한 순서대로 적재되어 있으니 메모리를 읽을 때 뒤로 돌아갈 필요가 없을 것이다.

728x90

'개발 > C++' 카테고리의 다른 글

16장 예외처리  (0) 2021.12.09
15장 상속과 다형성  (0) 2021.12.09
14장 연산자 오버로딩  (0) 2021.12.09
13장 파일 입력과 출력  (0) 2019.05.21
12장 템플릿, 벡터, 스택  (0) 2019.05.13
11장 포인터와 동적 메모리 관리(후)  (0) 2019.05.09
11장 포인터와 동적 메모리 관리(전)  (0) 2019.05.08
10장 객체 지향 개념  (0) 2019.02.11

댓글