32. 빈 기반 클래스 최적화(Empty Base Optimization, EBO)

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C++
// 주제: 빈 기반 클래스 최적화(Empty Base Optimization, EBO)와 객체 레이아웃
//
// C++ 에서 "멤버가 없는(상태 없는) 타입"을 멤버로 담을 때와 기반 클래스로 상속할
// 때 객체 크기가 어떻게 달라지는지, 그리고 정책/할당자/펑터 같은 상태 없는 타입을
// 담는 라이브러리(예: std::vector 의 allocator, unique_ptr 의 deleter)가 왜 상속을
// 쓰는지 예측·설명하는 문제다.
//
// 과제:
//  1) 아래 각 sizeof 출력이 무엇이 될지 예측하라(일반적 64비트, 8바이트 정렬 가정).
//  2) EmptyMember 와 EmptyBase 의 크기가 왜 다른지 설명하라.
//  3) "빈 타입도 크기가 최소 1"인 규칙과, 그 규칙이 왜 상속에서는 완화되는지
//     (EBO 성립 조건 포함) 설명하라.
//  4) std::tuple / std::vector 의 allocator 저장이 이 최적화와 어떻게 연결되는지 논하라.
// 내부 동작 설명은 answer.md 에서 다룬다.

#include <cstdio>

struct Empty {};                       // 상태 없는 타입(펑터/정책/할당자 상징)

struct EmptyMember {                    // 빈 타입을 "멤버"로 보관
    Empty e;
    int value;
};

struct EmptyBase : Empty {             // 빈 타입을 "기반 클래스"로 상속
    int value;
};

struct TwoEmptyMembers {               // 빈 타입 둘을 멤버로
    Empty a;
    Empty b;
    int value;
};

int main() {
    std::printf("sizeof(Empty)          = %zu\n", sizeof(Empty));
    std::printf("sizeof(EmptyMember)    = %zu\n", sizeof(EmptyMember));
    std::printf("sizeof(EmptyBase)      = %zu\n", sizeof(EmptyBase));
    std::printf("sizeof(TwoEmptyMembers)= %zu\n", sizeof(TwoEmptyMembers));
    return 0;
}
내 리뷰 · C++
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.