다음 글은 이름이 어려우신 그 분의 웹페이지의 FAQ 2의 일부를 번역한 것입니다.
확실히 다른 두 객체면 주소가 서로 달라지도록 하기 위해서입니다. 같은 이유에서 new는 언제나 다른 객체의 포인터를 반환합니다.
다음을 봅시다.
1 2 3 4 5 6 7 8 9 10 11 12 |
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 2 3 4 5 6 7 8 9 10 11 12 |
struct X : Empty { int a; // ... }; void f(X* p) { void* p1 = p; void* p2 = &p->a; if (p1 == p2) cout << "nice: good optimizer"; } |
이 최적화는 안전하며 상당히 유용하게 쓰일 수 있습니다. 프로그래머는 빈 클래스들을 사용해 오버헤드 없이 간단한 컨셉을 잡을 수 있습니다. 일부 컴파일러들이 이 “빈 기본 클래스 최적화(Empty Base Class Optimization)”를 제공합니다.
더 읽을 거리