> 백엔드 개발 > C++ > C 11의 'extern template'은 어떻게 중복 템플릿 인스턴스화를 방지하고 컴파일 시간을 단축할 수 있습니까?

C 11의 'extern template'은 어떻게 중복 템플릿 인스턴스화를 방지하고 컴파일 시간을 단축할 수 있습니까?

Patricia Arquette
풀어 주다: 2024-12-12 11:02:09
원래의
129명이 탐색했습니다.

How Can `extern template` in C  11 Prevent Duplicate Template Instantiations and Reduce Compilation Time?

C 11에서 인스턴스화를 피하기 위해 extern 템플릿 사용

extern 템플릿은 개발자가 특정 컴파일 단위에서 템플릿의 인스턴스화를 방지할 수 있게 해주는 강력한 C 11 키워드입니다. . 이는 여러 소스 파일이 서로 다른 매개변수를 사용하여 동일한 템플릿을 인스턴스화하여 코드가 중복되고 컴파일 시간이 늘어나는 대규모 코드베이스로 작업할 때 특히 유용할 수 있습니다.

함수 템플릿

함수 템플릿의 경우, extern 템플릿은 함수가 다른 곳에서 인스턴스화될 것이라는 것을 알고 있을 때 컴파일러가 특정 템플릿을 인스턴스화하지 않도록 강제하는 데 사용될 수 있습니다. 다음 예를 고려하십시오.

// header.h
template<typename T>
void ReallyBigFunction() {
    // Body
}
로그인 후 복사
// source1.cpp
#include "header.h"
void something1() {
    ReallyBigFunction<int>();
}
로그인 후 복사
// source2.cpp
#include "header.h"
extern template void ReallyBigFunction<int>();
void something2() {
    ReallyBigFunction<int>();
}
로그인 후 복사
로그인 후 복사

extern 템플릿이 없으면 컴파일러는 RealBigFunction source1.cpp와 source2.cpp 모두에 다음과 같은 개체 파일이 생성됩니다.

source1.o
    void something1()
    void ReallyBigFunction<int>()    // Compiled first time

source2.o
    void something2()
    void ReallyBigFunction<int>()    // Compiled second time
로그인 후 복사

이러한 파일을 함께 연결하면 RealBigFunction 삭제되어 컴파일 시간과 개체 파일 크기가 낭비됩니다.

이 문제를 방지하려면 source2.cpp에서 extern 템플릿을 사용할 수 있습니다.

// source2.cpp
#include "header.h"
extern template void ReallyBigFunction<int>();
void something2() {
    ReallyBigFunction<int>();
}
로그인 후 복사
로그인 후 복사

이렇게 하면 다음과 같은 개체 파일이 생성됩니다.

source1.o
    void something1()
    void ReallyBigFunction<int>() // Compiled just one time

source2.o
    void something2()
    // No ReallyBigFunction<int> here because of the extern
로그인 후 복사

이러한 개체 파일이 연결되면 두 번째 개체 파일은 첫 번째 개체 파일의 기호를 사용하여 중복 코드를 피하고 코드를 줄입니다.

클래스 템플릿

외부 템플릿을 클래스 템플릿과 함께 사용하여 특정 클래스 멤버의 인스턴스화를 방지할 수도 있습니다. 예를 들면 다음과 같습니다.

// header.h
template<typename T>
class Foo {
public:
    T f();
};
로그인 후 복사
// source1.cpp
#include "header.h"
Foo<int> foo1;
로그인 후 복사
// source2.cpp
#include "header.h"
extern template class Foo<int>;
Foo<int> foo2;
로그인 후 복사

extern 템플릿이 없으면 컴파일러는 Foo에 대한 멤버 함수 f를 컴파일합니다. source1.cpp와 source2.cpp 모두에서 중복된 코드가 발생합니다. extern 템플릿을 사용하면 멤버 함수가 한 번만 컴파일됩니다.

결론

extern 템플릿은 C 11 프로젝트에서 중복 코드를 피하고 컴파일 시간을 줄이는 데 유용한 도구입니다. 불필요한 템플릿 인스턴스화를 방지하기 위해 선택적으로 extern 템플릿을 사용함으로써 개발자는 코드 성능을 최적화할 수 있습니다.

위 내용은 C 11의 'extern template'은 어떻게 중복 템플릿 인스턴스화를 방지하고 컴파일 시간을 단축할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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