模板在翻译单元中的显示方式

How does a template appear in a translation unit?

本文关键字:显示方式 单元 翻译      更新时间:2023-10-16

如果我在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;
        }
    }
}

那么如果我有主.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 个版本的列表吗?
  3. 如果我们的列表包含在另一个翻译单元中,它会同时出现在两者中吗?

当您专用化模板时,代码将放置在进行专用化的翻译单元中。

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

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

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