[C++] EBCO
1. EBCO
- Empty Base Class Optimization
- empty가 기반클래스가 되면 크기가 0으로 계산
#include <iostream>
using namespace std;
class Empty {};
class AAA
{
Empty a;
int b;
};
class BBB : public Empty
{
int b;
};
int main()
{
cout << sizeof(AAA) << endl; // 8
cout << sizeof(BBB) << endl; // 4, Empty가 기반클래스로 넘어오면 크기가 0
}
#include <iostream>
#include <type_traits>
using namespace std;
struct EMPTY {};
template<typename T, typename U> struct PAIR : T
{
U v2;
T& getValue1() { return *this; }
U& getValue2() { return v2; }
PAIR() = default;
template<typename A, typename B>
PAIR(A&& a, B&& b)
: T(std::forward<A>(a)), v2(std::forward<B>(b)) {}
};
int main()
{
//PAIR<int, int> p;
PAIR<EMPTY, int> p;
cout << sizeof(p) << endl; // 4
}
#include <iostream>
#include <type_traits>
using namespace std;
struct EMPTY {};
template<typename T, typename U, bool b = is_empty<T>::value>
struct PAIR
{};
// PAIR<int,int>
// PAIR<EMPTY,int>
// boost가 제안한 compressed pair 라이브러리
template<typename T, typename U> struct PAIR<T, U, false>
{
T v1;
U v2;
T& getValue1() { return v1; }
U& getValue2() { return v2; }
PAIR() = default;
template<typename A, typename B>
PAIR(A&& a, B&& b)
: v1(std::forward<A>(a)), v2(std::forward<B>(b)) {}
};
template<typename T, typename U> struct PAIR<T, U, true> : T
{
U v2;
T& getValue1() { return *this; }
U& getValue2() { return v2; }
PAIR() = default;
template<typename A, typename B>
PAIR(A&& a, B&& b)
: T(std::forward<A>(a)), v2(std::forward<B>(b)) {}
};
int main()
{
PAIR<int, int> p1;
PAIR<EMPTY, int> p2;
cout << sizeof(p1) << endl; // 8
cout << sizeof(p2) << endl; // 4
}
참고
codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
코드누리
This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄.
댓글남기기