Empty Base Optimization (공백 기본 클래스 최적화)
Efffective C++ 책에서 보면, EBO라는 개념이 나오는 데 이해가 안 가서 여러 자료를 통해 공부해봤다.
먼저, EBO를 코드를 통해 설명한다.
아래 코드에서 Class B의 크기는 8 또는 5이상의 크기로 나올 것이다.
왜? class A는 비어있더라도 크기가 0 이 아니다. C++은 독립 구조 객체는 반드시 크기가 0을 넘어야 한다는 제약
class A{}; // 빈 클래스
class B
{
private:
int num;
A a;
};
근데, EBO란 개념은 Class B 내 Class A의 크기를 최적화시키는 방법은 제안한다.
아래 코드로 구현을 하게되면, class B의 크기는 int의 크기만 나온다.
class A{};
class B : private A
{
private:
int num;
};
사실 여기서 제일 문제가 누가 이런걸 써? (나도 궁금해서 찾아보기 시작한 거임)
참고 자료 : https://stackoverflow.com/questions/4325144/when-do-programmers-use-empty-base-optimization-ebo
EBO는 policy based design에서 중요한 구문입니다.
그럼 Policy based Design 은 뭐야..?
정책 기반 설계는 현대 C++ 디자인에서 사용되는 용어라고 합니다.
C++ 템플릿 메타 프로그래밍과 연결되고, 전략 패턴의 컴파일 타임 변종으로 설명되고 있다.
근데 필자는 아직 템플릿프로그래밍이 익숙치 않고, 디자인패턴 또한 익숙치 않다. 그래서 참고 자료의 예제 코드를 보고 이해했다.
#include <iostream>
#include <string>
template <typename OutputPolicy, typename LanguagePolicy>
class HelloWorld : private OutputPolicy, private LanguagePolicy {
public:
// Behavior method.
void Run() const {
// Two policy methods.
Print(Message());
}
private:
using LanguagePolicy::Message;
using OutputPolicy::Print;
};
class OutputPolicyWriteToCout {
protected:
template <typename MessageType>
void Print(MessageType&& message) const {
std::cout << message << std::endl;
}
};
class LanguagePolicyEnglish {
protected:
std::string Message() const { return "Hello, World!"; }
};
class LanguagePolicyGerman {
protected:
std::string Message() const { return "Hallo Welt!"; }
};
int main() {
// Example 1
using HelloWorldEnglish = HelloWorld<OutputPolicyWriteToCout, LanguagePolicyEnglish>;
HelloWorldEnglish hello_world;
hello_world.Run(); // Prints "Hello, World!".
// Example 2
// Does the same, but uses another language policy.
using HelloWorldGerman = HelloWorld<OutputPolicyWriteToCout, LanguagePolicyGerman>;
HelloWorldGerman hello_world2;
hello_world2.Run(); // Prints "Hallo Welt!".
HelloWorld <OutputPolicyWriteToCout, LanguagePolicyEnglish> a;
std::cout << "Sizeof(HelloWorld):"<<sizeof(a) << std::endl;
}
여기서
포인트 1) private 상속
포인트 2) 클래스 내 멤버 함수만 상속
위 두개가 정책 기반 설계의 중심이고, 그 중심에 EBO가 필요하다.
클래스 Hellworld 크기는 1byte이다.
말 그대로 비정적 변수의 사용은 없고, 함수만으로 클래스를 설계하는 디자인을 의미하는 것 같다.
참고자료 : https://en.wikipedia.org/wiki/Modern_C%2B%2B_Design#Policy-based_design
너무 영어여서, 다 알 수가 없다. 더 궁금하신 분은 위 자료를 통해서 더 자세한 설명을 댓글로 알려주시면 좋겠습니다.
'개발 > C++' 카테고리의 다른 글
std::move, std::forward (0) | 2023.07.25 |
---|---|
람다 표현식 (lambda expression) (0) | 2022.08.19 |
Copy Elision, RVO (0) | 2022.07.07 |
std::function 이란? (0) | 2022.04.11 |
JsonCpp 사용법 (2) | 2022.02.04 |