1 분 소요

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 😄. 

Top

태그: , ,

카테고리:

업데이트:

댓글남기기