1.函式模版的編譯模式分兩種:完全包含編譯模式和區域性編譯模式(需要用export關鍵字)
2.不同的編譯器對這兩種編譯模式的支援各不相同,但一般都支援完全包含編譯模式,具體支援情況需要參照具體使用的編譯器文件
模版函式和普通函式在使用的時候有一定的區別:
(1)普通函式在使用的原始檔中直接include該函式的宣告即可
(2)模版函式在使用的原始檔中既要include模版函式的宣告,也要include模版函式的定義(因為只有在編譯的時候,根據模版函式的定義進行例項化後生成的函式才是真正的函式定義)
/舉例說明完全包含編譯模式:
(1)test.h中在宣告的後面include "test.cpp ",這樣做的目的是把sum的宣告和定義放在兩個檔案中
(2)first.cpp和second.cpp中都用到了sum函式模版,所以都要include "test.h ",所以在兩個cpp檔案中都有乙份sum的定義,所以在例項化以後,存在兩個相同的函式定義:int sum(int a,int b)
(3)對於這種重複定義的問題,完全包含編譯模式下,編譯器自己會去除冗餘的函式定義,而只保留乙個int sum(int a,int b)函式的定義
(4)所以這種編譯模式下,編譯效率會降低(因為如果100的cpp檔案中都呼叫了sum(2,3),那麼會存在100個int sum(int a,int b)函式的定義,去除其餘99個冗餘定義的操作會占用大量的編譯時間)
test.h標頭檔案的內容:
template
type sum(type a,type b);//函式模版的宣告
#include "test.cpp "
test.cpp檔案的內容:
template
type sum(type a,type b)
//函式模版的定義
first.cpp檔案的內容:
#include "test.h "
int main()
second.cpp檔案的內容:
#include "test.h "
int second()
所以為了避免完全編譯模式的這種低效率,出現了區域性編譯模式
///舉例說明區域性編譯模式
(1)test.h標頭檔案中不需要再include "test.cpp "
(2)需要使用sum的cpp檔案中只需要include "test.h "即可
(3)在例項化sum函式時,編譯器會自動跟蹤到sum函式模版的定義(通過export關鍵字)
(4)這樣就提高了編譯速度
test.h標頭檔案的內容:
template
type sum(type a,type b);//函式模版的宣告
//#include "test.cpp "//不需要包含sum函式的定義
test.cpp檔案的內容:
export template //前面加上export關鍵字
type sum(type a,type b)
//函式模版的定義
first.cpp檔案的內容:
#include "test.h "
int main()
second.cpp檔案的內容:
#include "test.h "
int second()
綜上所述:export關鍵字只有在使用區域性編譯模式時才會用到,同時需要編譯器支援區域性編譯模式,如果編譯器不支援這種編譯模式,那麼不能使用export
Markdown編輯模板
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...
CSDN編輯模板
csdn編輯模板 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下markdown的基本語法知識。全新的介面設計,將會帶來全新的寫作體驗 在創作中心設定你喜愛的 高亮樣式,markdown將 片顯示選擇的高亮樣式進...
python模板模式 模板設計模式
模板模式使用抽象操作在基類中定義基本演算法,其中子類覆蓋具體行為。模板模式將演算法的輪廓保留在單獨的方法中。該方法被稱為模板方法。以下是模板模式的不同功能 它定義了操作中演算法的骨架。它包括子類,它重新定義了演算法的某些步驟。有關模板設計模式的實現,請參考以下 class makemeal def ...