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){return a+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 <typename Type>
Type sum(Type a,Type b);//函數模版的聲明
#include "test.cpp "
test.cpp文件的內容:
template <typename Type>
Type sum(Type a,Type b)
{
return a+b;
}//函數模版的定義
first.cpp文件的內容:
#include "test.h "
int main()
{
sum(2,3);
return 0;
}
second.cpp文件的內容:
#include "test.h "
int second()
{
sum(2,3);
return 0;
}
所以爲了避免完全編譯模式的這種低效率,出現了局部編譯模式
///////舉例說明局部編譯模式
(1)test.h頭文件中不需要再include "test.cpp "
(2)需要使用sum的cpp文件中只需要include "test.h "即可
(3)在實例化sum函數時,編譯器會自動跟蹤到sum函數模版的定義(通過export關鍵字)
(4)這樣就提高了編譯速度
test.h頭文件的內容:
template <typename Type>
Type sum(Type a,Type b);//函數模版的聲明
//#include "test.cpp "//不需要包含sum函數的定義
test.cpp文件的內容:
export template <typename Type> //前面加上export關鍵字
Type sum(Type a,Type b)
{
return a+b;
}//函數模版的定義
first.cpp文件的內容:
#include "test.h "
int main()
{
sum(2,3);
return 0;
}
second.cpp文件的內容:
#include "test.h "
int second()
{
sum(2,3);
return 0;
}
綜上所述:export關鍵字只有在使用局部編譯模式時纔會用到,同時需要編譯器支持局部編譯模式,如果編譯器不支持這種編譯模式,那麼不能使用export
export關鍵字的用法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.