Policy Based Design
-
클래스가 사용하는 정책을 템플릿 인자를 통해서 교체 할 수 있게 만드는 디자인
-
성능 저하 없이 정책을 교체 할 수 있음
-
대부분의 정책은 담은 "단위 전략 클래스"는 지켜야 하는 규칙이 있음
-
규칙을 표현하는 코딩 방식은 없음(인터페이스 사용시 가상 함수이므로 약간의 오버헤드 발생), C++20 concept 문법
-
우리가 만든 동기화 정책클래스는 "lock/unlock" 함수가 필요함
-
템플릿 기반 라이브러리, 특히 STL에서 널리 사용되는 디자인 기법
-
#include <iostream>
using namespace std;
// 1개의 클래스로 정책 템플릿 인자를 통해서 다르게 구현 할 수 있도록 디자인
template<typename T, typename ThreadModel> class List
{
ThreadModel tm;
public:
void push_front(const T& a)
{
tm.lock();
// 구현부 코드
tm.unlock();
}
};
// 싱글 쓰레드 기반 환경용
class NoLock
{
public:
inline void Lock() {};
inline void Unlock() {}
};
// 멀티 쓰레드 기반 환경용
class MutexLock
{
public:
inline void Lock() {};
inline void Unlock() {}
};
// 환경에 따라서 클래스 생성 시 전략을 선택 할 수 있음
// 싱글 쓰레드용 생성
//List<int, NoLock> s;
// 멀티 쓰레드용 생성
List<int, MutexLock> s;
int main()
{
s.push_front(10);
}
STL allocator
-
C++에서 메모리 할당 방법은 다양함
-
new, malloc, calloc, win32 api, linux system call
-
-
STL에서는 각 데이터 컨테이너의 템플릿 인자로 메모리 할당 방식에 대한 전략을 선택할 수 있도록 지원함
#include <iostream>
using namespace std;
// STL의 Vector 생각
// 메모리 할당기
template<typename T> class allocator
{
public:
T* allocate() {}
void deallocate() {}
};
template<typename T, typename Ax = allocator<T>> class vector
{
T* buff;
Ax ax;
public:
void resize(int n)
{
// 버퍼 재할당이 필요하다면 어떻게 할까요?
// new, malloc, calloc, win32 api, linux system call
T* p = ax.allocate(n);
ax.deallocate(p);
}
};
int main()
{
vector<int, MyAlloc<int>> v(10);
v.resize(20);
}
rebind
#include <iostream>
using namespace std;
template<typename T> class allocator
{
public:
T* allocate(int sz) { return new T[sz]; }
void deallocate(T* p) { delete[] p; }
template<typename U> struct rebind
{
typename allocator<U> other;
};
};
template<typename T, typename Ax = allocator<T> > class list
{
struct NODE
{
T data;
NODE* next, * prev;
};
//Ax ax; // allocator<int>
//allocator<int>::rebind<NODE>::other ax; // allocator<NODE> ax;
typename Ax::template rebind<NODE>::other ax; // allocator<NODE> ax;
public:
void push_front(const T& a)
{
ax.allocate(1);
}
};
int main()
{
list<int> s;
s.push_front(10);
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 템플릿 디자인 Member Detect IDioms (0) | 2021.01.10 |
---|---|
C++ 템플릿 디자인 SFINAE(Substitution Failure Is Not An Error) (0) | 2021.01.10 |
C++ 템플릿 디자인 패턴 CRTP 활용 (0) | 2021.01.08 |
C++ 템플릿 디자인 패턴 CRTP(Curiously Recurring Template Pattern) 패턴 (0) | 2021.01.07 |
C++ 템플릿 패턴 Thin template, 코드 메모리 최적화 기법 (0) | 2021.01.07 |