> 백엔드 개발 > C++ > C 11의 `extern template`은 어떻게 중복 템플릿 인스턴스화를 피할 수 있습니까?

C 11의 `extern template`은 어떻게 중복 템플릿 인스턴스화를 피할 수 있습니까?

DDD
풀어 주다: 2024-12-20 14:59:13
원래의
326명이 탐색했습니다.

How Can `extern template` in C  11 Avoid Redundant Template Instantiations?

extern 템플릿을 사용한 템플릿 인스턴스화 방지(C 11)

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 source1.cpp에서는 프로젝트에서 한 번만 인스턴스화되도록 합니다.

중요 고려 사항

extern 템플릿의 사용은 다음과 같은 상황으로 제한되어야 합니다. 템플릿이 다른 곳에서 인스턴스화된다는 것을 알고 있습니다. 인스턴스화되지 않으면 프로그램에서 확인되지 않은 참조가 발생합니다. 가장 좋은 방법은 단일 헤더 파일에서 모든 템플릿 인스턴스화를 선언하여 서로 다른 파일의 여러 인스턴스화로 인해 발생할 수 있는 문제를 방지하는 것입니다.

위 내용은 C 11의 `extern template`은 어떻게 중복 템플릿 인스턴스화를 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿