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++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.