클래스 템플릿이 인스턴스화 하여 Object로 생성되면 동일한 역할을 하는 중복 함수가 생성될 수 있다.
이 중복되는 함수들을 없애서 메모리 사용량을 줄여주는 방식을 Thin Template 기법 이라고 한다.
// Thin Template 적용 전
template <typename T>
class Stack {
public:
...
void push(const T& data) { ... }
void pop() { ... }
unsigned int size() { return mSize; }
bool isEmpty() { return mSize == 0; }
...
private:
unsigned int mSize{ };
...
};
struct Point {
float x{ };
float y{ };
float z{ };
};
int main() {
Stack<int> i;
Stack<float> f;
Stack<Point> p;
// 3개의 Template Instantiation 발생
// 따라서, 4 (함수 개수) * 3 (타입 개수) = 총 12개의 함수 생성
return 0;
}
위의 코드는 템플릿이 인스턴스화 하면 각 타입마다 동일한 역할을 하는
size 함수와 isEmpty 함수가 중복 생성되며 메모리 낭비가 발생한다.
따라서, 모든 Object에 통용되며 템플릿 타입 T를 사용하지 않는 함수들을 Base Class에 정의하고 이를 상속한다.
// Thin Template 적용 후
class StackBase {
public:
...
unsigned int size() { return mSize; }
bool isEmpty() { return mSize == 0; }
...
private:
unsigned int mSize{ };
...
};
template <typename T>
class Stack: public StackBase {
public:
...
void push(const T& data) { ... }
void pop() { ... }
...
private:
...
};
struct Point {
float x{ };
float y{ };
float z{ };
};
int main() {
Stack<int> i;
Stack<float> f;
Stack<Point> p;
// 3개의 Template Instantiation 발생
// 따라서, 2 (함수 개수) * 3 (타입 개수) + 2 (기반 함수 개수) = 총 8개의 함수 생성
return 0;
}
위와같이 템플릿 타입 T를 사용하지 않는 size, isEmpty 함수를 StackBase 클래스에 정의하고
StackBase 클래스를 Stack Class Template가 상속하는것으로 중복 함수 생성을 막아 메모리 사용량을 줄일 수 있다.
※ pop 함수는 Stack의 멤버에 직접 접근해야 하므로 Base Class로 옮길 수 없다.
Reference
'Programming > C++ Template' 카테고리의 다른 글
Type Selection (0) | 2024.05.21 |
---|---|
CRTP (Curiously Recurring Template Pattern) (0) | 2024.05.11 |