본문 바로가기

Programming/C++ Template

Thin Template 기법

클래스 템플릿이 인스턴스화 하여 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