gpt4 book ai didi

c++ - 模板如何出现在翻译单元中?

转载 作者:行者123 更新时间:2023-11-28 00:33:23 28 4
gpt4 key购买 nike

如果我在 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
  1. 如何将代码放入翻译单元?
  2. main.cpp的翻译单元是否有2个版本的list?
  3. 如果我们将列表包含在另一个翻译单元中,它会出现在两个翻译单元中吗?

最佳答案

当您特化模板时,代码将被放置在发生特化的翻译单元中。

如果您在不同的翻译单元中反复使用模板,您会发现每个翻译单元都会获得一份代码拷贝。这称为代码膨胀,是使用模板的主要缺点之一。

您可以声明模板特化,并将它们的代码放在单个翻译单元中,但是如果没有与此处相同的链接器问题,您将无法创建新的特化。

致 #2:当类型足够相似时,一些编译器将使用单一定义。例如存储一个指针。您可以创建十几种不同的指针类型,只有将它们作为单独类型处理的代码才需要使用类型专门化进行复制。但这是高度依赖编译器的。

关于c++ - 模板如何出现在翻译单元中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21950605/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com