[Design Pattern] 정책기반 디자인패턴(Policy Base Design) in C++
1. Policy Base Design
- 템플릿 인자로 Policy를 담은 클래스를 전달하는 기술
- 성능 저하 없이 Policy만 교체 가능
- Policy 클래스에는 지켜야 하는 규칙이 있게 됨
- 규칙을 표현하는 코딩 방식은 없음
- 동기화 정책 클래스에는 lock/unlock 이 필요
- 템플릿 기반 라이브러리, 특히 STL에서 널리 사용되는 디자인 기법
2. 코드로 알아보기
class nolock;
template<typename T,
typename ThreadModel = nolock> class List
{
ThreadModel tm;
public:
void push_front(const T& a)
{
tm.lock();
// ...
tm.unlock();
}
};
// 동기화 policy를 담은 클래스
class nolock
{
public:
inline void lock() {}
inline void unlock() {}
};
class posix_lock
{
public:
inline void lock() {}
inline void unlock() {}
};
//-------------------------------
// 2번째 인자로 정책을 보냄
List<int, nolock> s; // 전역변수. 멀티스레드에 안전하지 않다.
int main()
{
s.push_front(10);
}
- STL의 실제 vector
template<
class T,
class Allocator = std::allocator<T> // Allocator 를 교체할 수 있음
> class vector;
#include <iostream>
#include <vector>
using namespace std;
/*
template<typename T,
typename Ax = allocator<T>> class vector
{
T* buff;
int size;
Ax ax; //메모리 allocator
public:
void push_back(const T& a)
{
// 메모리 재할당
buff = ax.allocate(10); // 메모리 할당
ax.deallocate(buff, 10); // 메모리 해지
}
};
*/
int main()
{
vector<int> v;
}
- C++ 표준 메모리 allocator
#include <iostream>
#include <vector>
using namespace std;
struct Point
{
int x, y;
Point(int a = 0, int b = 0) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
~Point() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
int main()
{
// C++ 표준 메모리 할당기
std::allocator<Point> ax;
// Point 메모리만 2개 할당
Point* p = ax.allocate(2);
// 생성자 호출
ax.construct(p, 1, 2); // new(p) Point(1,2)
ax.construct(p+1, 1, 2);
cout << "==============" << endl;
// 소멸자 호출
ax.destroy(p);
ax.destroy(p+1);
// 메모리 해지
ax.deallocate(p, 2);
}
참고
codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
코드누리
cppreference
This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄.
댓글남기기