C 11의 extern 템플릿 키워드는 불필요한 템플릿 인스턴스화를 방지하여 컴파일 시간과 개체 파일을 줄이는 메커니즘을 제공합니다. 크기. 특정 시나리오에서는 템플릿이 다른 곳에서 인스턴스화된다는 것을 알고 이 키워드를 사용하여 컴파일러에 인스턴스화를 수행하지 않도록 지시하는 것이 좋습니다.
질문에 제시된 예시와는 달리 extern 템플릿 키워드는 함수 템플릿에도 사용할 수 있습니다. 다음 예를 고려하십시오.
// header.h template<typename T> void bigFunc(); // source1.cpp #include "header.h" void something1() { bigFunc<int>(); } // source2.cpp #include "header.h" extern template void bigFunc<int>(); // This prevents its compilation in source2.cpp void something2() { bigFunc<int>(); }
extern 템플릿 문이 없으면 bigFunc는 source1.cpp와 source2.cpp 모두에서 컴파일되어 중복 개체 코드가 생성됩니다. extern 템플릿을 사용하면 컴파일러는 source2.cpp에서 bigFunc를 인스턴스화하지 않도록 지시받아 컴파일 시간과 객체 파일 크기를 줄입니다.
질문의 그림 2에서 볼 수 있듯이 extern 템플릿을 클래스에도 사용할 수 있습니다. 템플릿:
// header.h template<typename T> class myClass { T getValue(); }; // source1.cpp #include "header.h" extern template class myClass<int>; // Prevent instantiation here void something1() { myClass<int> obj; obj.getValue(); }
이 시나리오에서 컴파일러는 myClass
extern 템플릿의 사용은 다음과 같은 상황으로 제한되어야 합니다. 템플릿이 다른 곳에서 인스턴스화된다는 것을 알고 있습니다. 인스턴스화되지 않으면 프로그램에서 확인되지 않은 참조가 발생합니다. 가장 좋은 방법은 단일 헤더 파일에서 모든 템플릿 인스턴스화를 선언하여 서로 다른 파일의 여러 인스턴스화로 인해 발생할 수 있는 문제를 방지하는 것입니다.
위 내용은 C 11의 `extern template`은 어떻게 중복 템플릿 인스턴스화를 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!