c++에 관한 내용]

 

비어있는 클래스를 객체화 시켰을 때의 사이즈는 0이 아니라 1이다.

 

공백 클래스는 개념적으로 차지하는 메모리 공간이 없어야 한다.
하지만, C++에서는 "독립 구조 객체는 반드시 크기가 0을 넘어야 한다"는 제약이 있어서
변수를 포함한 모든 객체는 비어 있는 클래스에 1byte의 공간을 주는 것이다.

- 공백 클래스의 조건 -
1. static 멤버를 제외한 (할당 위치 data 영역이다.) 멤버 데이터가 존재하지 않아야 한다.
2. virtual 함수가 존재하면 안된다 (virtual 함수는 가상 함수 테이블을 가지고 있다.)
3. virtual base 클래스가 없어야 한다. (2번과 같다.)

 

백 클래스의 조건을 반대로 생각해보면 공백 클래스는 다음을 가질 수 있다.
1. static 멤버 데이터.
2. non-virtual 멤버 함수.
3. typedef 나 enum 같은 것들...


4byte라는 주소공간이 생기면서 다른 instance와 구별이 가능하기 때문에 empty base class optimization을 통해 1byte라는 overhead가 제외되는 것이다.

하지만 공백 클래스가 파생 클래스에 상속되면 얘기가 달라진다.
즉, 아래의 (1)과 (2)에서 B의 크기가 달라진다.

(1)
class A {};
class B
{
private:
int num;


A a;
};

(2)
class A {};
class B : public A
{
private:
int num;
};

(1)의 경우에서 sizeof(B)는 sizeof(int) + { bytepadding (1바이트지만 구조체 크기에 맞춰서) sizeof(A) ) }에 의해 8이 되며,
(2)의 경우에서는 sizeof(int) + 0 이 되어 4가 된다.

 

이것이 EBCO 이며 최근 거의 모든 컴파일러에서 지원하는 최적화 기법이다.

 

 

 



 

c++에서는 구조체(struct) 역시 class와 동일하기 때문에 이 내용이 동일하게 적용된다.

출처

http://egloos.zum.com/sweeper/v/1929517

 

Posted by GENESIS8

댓글을 달아 주세요