3 回答

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
template <class Type>
struct listNode
{
Type number;
listNode<Type> *link;
}
因?yàn)槟愕膌istNode是一個(gè)模版,只有給出具體的類型參數(shù),編譯器才能推導(dǎo)出具體的代碼。
你在使用中struct listNode<int> i;那么就得到了一個(gè)保存整數(shù)類型的節(jié)點(diǎn),
struct listNode<float> f; 就得到了一個(gè)保存浮點(diǎn)類型的節(jié)點(diǎn)f。如果你不給出類型,編譯器怎么知道生成什么樣子的代碼呢。
改寫一般是這樣子的
template <class _Ty>
class LinkedList
{
public:
struct listNode
{
_Ty number;
listNode<_Ty> *link;
};
typedef typename listNode<_Ty> * listNodePtr;
public:
LinkedList(){;};
void addNode(_Ty node);
......其他方法
}
用的時(shí)候
LinkedList<int> list;
LinkedList<int>::listNode node;
LinkedList<int>::listNodePtr pNode;
list.addNode(node);

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
實(shí)現(xiàn)模板實(shí)例化是編譯器的編譯期行為,編譯期按不同類型參數(shù)實(shí)例化模板,并且目前而言編譯器一般不會(huì)有通用且有效的優(yōu)化行為(因?yàn)槟0逯械念愋蛥?shù)自由度很高,編譯器無(wú)法判斷哪個(gè)類或函數(shù)的模板實(shí)例化版本是不需要的而可以用另一些版本代替)。因此如果調(diào)用的不同類型參數(shù)數(shù)量比較多,的確會(huì)造成很明顯的代碼膨脹導(dǎo)致最終目標(biāo)文件體積明顯增加。如果要減少目標(biāo)文件體積,可以限制調(diào)用的類型參數(shù)的實(shí)例數(shù),例如在不同的類之間盡可能使用繼承而不是直接當(dāng)作相互無(wú)關(guān)的模板類型參數(shù)(不過(guò)這樣可能會(huì)略損失運(yùn)行期性能,尤其是使用虛繼承時(shí);另外面向?qū)ο?/a>范型相對(duì)于泛型而言,運(yùn)行期限制更多,靈活性略差,有時(shí)候可能不得不多寫一些重復(fù)代碼)。
至于函數(shù)調(diào)用是目標(biāo)代碼的運(yùn)行期行為,目標(biāo)代碼已經(jīng)生成好了(由于是本機(jī)代碼,不會(huì)保存類型等元信息),和模板無(wú)關(guān)(模板在編譯早期展開(kāi)后就可以當(dāng)作不存在了)。
- 3 回答
- 0 關(guān)注
- 787 瀏覽
添加回答
舉報(bào)