반응형
- Lazy Instantiation
- 사용되지 않은 템플릿 클래스는 인스턴스화 되지 않음
- 사용되지 않은 템플릿 클래스의 멤버 함수도 인스턴스화 되지 않음
- 사용되지 않은 템플릿 클래스의 static 함수도 인스턴스화 되지 않음
- 사용되지 않은 전역 템플릿 변수도 인스턴스화 되지 않음
template<typename T> class A
{
T data;
public:
void foo(T n) { *n = 10; } // 참조 오류 코드
};
int main()
{
A<int> a;
// a.foo(1); 템플릿의 멤버 함수가 호출되지 않는다면 인스턴스화 되지 않으므로 컴파일 성공
}
struct Resource1
{
Resource1() { cout << "Resource1()" << endl; }
~Resource1() { cout << "~Resource1()" << endl; }
};
struct Resource2
{
Resource2() { cout << "Resource2()" << endl; }
~Resource2() { cout << "Resource2()" << endl; }
};
template<typename T> struct Test
{
Resource1 res1; // 클래스내 메모리 할당이 필요하므로 인스턴스화됨
static Resource2 res2; // static 멤버는 별도 메모리 할당으로 인스턴스화 되지 않음
};
template<typename T> Resource2 Test<T>::res2; // 사용되지 않아서 인스턴스화 되지 않음
int main()
{
cout << "main" << endl; // 1. 메인 출력
Test<int> t; // 2. Resource1 생성자 출력
}
- if 문과 Lazy Instantiation
- if 문은 "실행시간 조건문"으로 컴파일 시간에 조건이 false로 결정되어도 if 문에 있는 코드는 항상 사용되는 것으로 간주함
- C++17 if constexpr는 "컴파일 시간 조건문"으로 조건이 false로 결정되면 if 문에 포함된 코드는 사용되지 않는 것으로 간주됨
- 동일한 이름의 함수가 여러개 있을 때 어떤 함수를 호출할 지 결정하는 것은 컴파일 시간에 결정되므로 선택되지 않은 함수가 템플릿이라면 인스턴스화 되지 않음
template<typename T> void foo(T n)
{
*n = 10; // 참조 오류 코드
}
int main()
{
if(false) // 런타임 조건식이므로 foo는 인스턴스화 됨
foo(0);
if constexpr ( false ) // C++17의 컴파일타임 조건식이므로 foo는 인스턴스화 되지 않음
foo(0);
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 템플릿 타입 추론(std::typeid, boost::type_index 활용) (0) | 2019.07.14 |
---|---|
C++ 비주얼스튜디오에서 boost 라이브러리 사용 방법 (0) | 2019.06.30 |
C++ 템플릿 주의사항/template instantiation (0) | 2019.05.28 |
C++ 템플릿 Identity (0) | 2019.05.28 |
C++ Idioms/Object Generator (0) | 2019.05.28 |