首頁 > 後端開發 > 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 template 可用於強制編譯器在知道該函數將在其他地方實例化時不要實例化特定模板。考慮以下範例:

// 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 模板,編譯器會編譯ReallyBigFunction;在source1.cpp 和source2.cpp 中,產生下列目標檔:

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

source2.o
    void something2()
    void ReallyBigFunction<int>()    // Compiled second time
登入後複製

將這些檔案連結在一起將產生IndeedBigFunction的一份副本;被丟棄,浪費編譯時間和目標檔案大小。

為了避免這個問題,我們可以在 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
登入後複製

連結這些目標檔案時,第二個目標檔案將使用第一個目標檔案中的符號,避免重複程式碼並減少編譯time.

類別模板

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 模板,編譯器會將成員函數f 編譯為Foo;在source1.cpp和source2.cpp中,導致重複的程式碼。使用 extern 範本可確保成員函數僅編譯一次。

結論

extern 範本是避免重複程式碼並減少 C 11 專案中編譯時間的寶貴工具。透過選擇性地使用 extern 模板來防止不必要的模板實例化,開發人員可以優化其程式碼的效能。

以上是C 11 中的「extern template」如何防止重複模板實例化並減少編譯時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板