第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用extern模板(C ++ 11)

使用extern模板(C ++ 11)

C++
慕哥6287543 2019-08-16 14:57:32
使用extern模板(C ++ 11)圖1:功能模板TemplHeader.htemplate<typename T>void f();TemplCpp.cpptemplate<typename T>void f(){    //...}    //explicit instantationtemplate void f<T>();Main.cpp的#include "TemplHeader.h"extern template void f<T>(); //is this correct?int main() {     f<char>();     return 0;}這是正確的使用方法extern template,還是僅將此關(guān)鍵字用于類(lèi)模板,如圖2所示?圖2:類(lèi)模板TemplHeader.htemplate<typename T>class foo {     T f();};TemplCpp.cpptemplate<typename T>void foo<T>::f() {     //...}//explicit instantationtemplate class foo<int>;Main.cpp的#include "TemplHeader.h"extern template class foo<int>();int main() {     foo<int> test;     return 0;}我知道將所有這些放在一個(gè)頭文件中是好的,但如果我們?cè)诙鄠€(gè)文件中實(shí)例化具有相同參數(shù)的模板,那么我們會(huì)得到多個(gè)相同的定義,編譯器會(huì)將它們?nèi)縿h除(除了一個(gè))以避免錯(cuò)誤。我該怎么用extern template?我們可以只將它用于類(lèi),還是可以將它用于函數(shù)?此外,圖1和圖2可以擴(kuò)展為模板位于單個(gè)頭文件中的解決方案。在這種情況下,我們需要使用extern template關(guān)鍵字來(lái)避免多個(gè)相同的瞬時(shí)。這僅適用于課程或功能嗎?
查看完整描述

3 回答

?
12345678_0001

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

當(dāng)您知道它將在其他地方實(shí)例化時(shí),您應(yīng)該只使用extern template強(qiáng)制編譯器實(shí)例化模板。它用于減少編譯時(shí)間和目標(biāo)文件大小。

例如:

// header.htemplate<typename T>void ReallyBigFunction(){
    // Body}// source1.cpp#include "header.h"void something1(){
    ReallyBigFunction<int>();}// source2.cpp#include "header.h"void something2(){
    ReallyBigFunction<int>();}

這將導(dǎo)致以下目標(biāo)文件:

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

如果兩個(gè)文件都鏈接在一起,void ReallyBigFunction<int>()則會(huì)丟棄一個(gè)文件,從而導(dǎo)致浪費(fèi)的編譯時(shí)間和目標(biāo)文件大小。

為了不浪費(fèi)編譯時(shí)間和目標(biāo)文件大小,有一個(gè)extern關(guān)鍵字使編譯器無(wú)法編譯模板函數(shù)。當(dāng)且僅當(dāng)您知道它在其他地方使用相同的二進(jìn)制文件時(shí),您應(yīng)該使用它。

更改source2.cpp到:

// source2.cpp#include "header.h"extern template void ReallyBigFunction<int>();void something2(){
    ReallyBigFunction<int>();}

將導(dǎo)致以下目標(biāo)文件:

source1.o    void something1()
    void ReallyBigFunction<int>() // compiled just one timesource2.o    void something2()
    // No ReallyBigFunction<int> here because of the extern

當(dāng)這兩者都鏈接在一起時(shí),第二個(gè)目標(biāo)文件將只使用第一個(gè)目標(biāo)文件中的符號(hào)。不需要丟棄,也不需要浪費(fèi)編譯時(shí)間和目標(biāo)文件大小。

這應(yīng)該僅在項(xiàng)目中使用,例如在多次使用模板時(shí)vector<int>,您應(yīng)該extern在除一個(gè)源文件之外的所有文件中使用。

這也適用于類(lèi)和函數(shù)作為一個(gè),甚至模板成員函數(shù)。


查看完整回答
反對(duì) 回復(fù) 2019-08-16
?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊

模板的已知問(wèn)題是代碼膨脹,這是在調(diào)用類(lèi)模板特化的每個(gè)模塊中生成類(lèi)定義的結(jié)果。為了防止這種情況,從C ++ 0x開(kāi)始,可以在類(lèi)模板特化之前使用關(guān)鍵字extern

#include <MyClass> extern template class CMyClass<int>;

模板類(lèi)的顯式實(shí)例應(yīng)僅在單個(gè)轉(zhuǎn)換單元中發(fā)生,最好是具有模板定義的轉(zhuǎn)換單元(MyClass.cpp)

template class CMyClass<int>;template class CMyClass<float>;


查看完整回答
反對(duì) 回復(fù) 2019-08-16
  • 3 回答
  • 0 關(guān)注
  • 1292 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)