본문 바로가기
번역/Bjarne Stroustrup's C++ Style and Technique FAQ

Why is the size of an empty class not zero?

by 겜게준 2018. 5. 10.

본문


왜 빈 클래스의 사이즈가 0이 아닌가요?

서로 다른 오브젝트의 주소값을 다르게 하기 위해서입니다. 같은 이유로 new 키워드는 항상 다른 오브젝트들의 포인터들을 반환합니다.

  class Empty { };

void f()
{
Empty a, b;
if (&a == &b) cout << "impossible: report error to compiler supplier";

Empty* p1 = new Empty;
Empty* p2 = new Empty;
if (p1 == p2) cout << "impossible: report error to compiler supplier";
}

빈 베이스 클래스[각주:1]를 별도의 바이트로 표시하지 않아도 된다는 규칙도 있습니다.


struct X : Empty {
int a;
// ...
};

void f(X* p)
{
void* p1 = p;
void* p2 = &p->a;
if (p1 == p2) cout << "nice: good optimizer";
}

이 최적화는 안전하고 가장 유용할 수 있습니다. 이 규칙은 프로그래머에게 오버헤드 없이 단순한 개념을 빈 클래스로 표시할 수 있도록 허용해줍니다[각주:2]. 현재 몇몇 컴파일러들은 빈 베이스 클래스 최적화를 제공합니다.






Why is the size of an empty class not zero?


To ensure that the addresses of two different objects will be different. For the same reason, "new" always returns pointers to distinct objects. Consider:


class Empty { };


void f()

{

Empty a, b;

if (&a == &b) cout << "impossible: report error to compiler supplier";


Empty* p1 = new Empty;

Empty* p2 = new Empty;

if (p1 == p2) cout << "impossible: report error to compiler supplier";

}


There is an interesting rule that says that an empty base class need not be represented by a separate byte:


struct X : Empty {

int a;

// ...

};


void f(X* p)

{

void* p1 = p;

void* p2 = &p->a;

if (p1 == p2) cout << "nice: good optimizer";

}


This optimization is safe and can be most useful. It allows a programmer to use empty classes to represent very simple concepts without overhead. Some current compilers provide this "empty base class optimization".

  1. 빈 부모클래스 [본문으로]
  2. boost variant, std nothorw, iterator 등등 아주 많이 쓰입니다. [본문으로]

댓글