如果我在list.h中有模板化的类定义:
template <class T>;
class list {
list *next;
T *data;
list(T *data){
this->next = NULL;
this->data = data;
}
void concat(T *data){
this->concat(new list<T>(data));
}
void concat(list<T> *sublist){
if (this->next != NULL){
this->next->concat(sublist);
} else {
this->next = sublist;
}
}
}
然后,如果我有main.cpp:
class bar {
bar(){
}
}
class baz {
baz(){
}
}
void main(){
new list<bar>(new bar());
new list<baz>(new baz());
}
然后我跑了:
gcc -c main.cpp
代码如何放入翻译单元中?
main.cpp的翻译单元是否具有list的2个版本?
如果我们将清单包含在另一个翻译单位中,该清单会同时出现在两个翻译单位中吗?
最佳答案
当您对模板进行专业化处理时,代码将被放置在进行专业化处理的翻译单元中。
如果您在不同的翻译单元中反复使用模板,则会发现每个翻译单元都会获得代码的副本。这称为代码膨胀,是模板使用的主要缺点之一。
您可以声明模板专业化,然后将这些模板的代码放在单个翻译单元中,但是如果没有相同的链接程序问题,您将无法创建新的专业化。
对于#2:当类型足够相似时,某些编译器将使用单个定义。例如存储一个指针。您可以创建十二种不同的指针类型,只有将它们作为单独类型处理的代码才需要使用类型专门化来复制。但这高度依赖于编译器。