면접때 틀렸던 질문이였다.
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이다.
또한 멤버 초기화 리스트에서도 순서대로 해야 효율적이라고 하는 것도 연관지어서 생각할 법하다.
선언한 순서대로 적재되어 있으니 메모리를 읽을 때 뒤로 돌아갈 필요가 없을 것이다.
'개발 > 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 |
댓글