gpt4 book ai didi

c++ - 模板类是否在 C++ 的不同编译单元中编译了多次?

转载 作者:太空狗 更新时间:2023-10-29 20:06:11 26 4
gpt4 key购买 nike

假设我有以下代码:

// templateClass.h
#ifndef TEMPLATE_CLASS_H
#define TEMPLATE_CLASS_H

template <typename T>
class tClass
{
public:
tClass();
};

#endif

// templateClassDef.inl
#ifndef TEMPLATE_CLASS_DEF_INL
#define TEMPLATE_CLASS_DEF_INL

template <typename T>
tClass<T>::tClass()
{
}

#endif

// normalClass.h
#include "templateClass.h"

class normal
{
public:
normal();
};

// normalClass.cpp
#include "normalClass.h"
#include "templateClassDef.inl"

normal::normal()
{
tClass<int> a;
}

// main.cpp
#include "templateClass.h"
#include "templateClassDef.inl"

#include "normalClass.h"

int main()
{
tClass<int> a;
normal b;

return 0;
}

请注意 inl文件没有像通常那样包含在 header 中,而是包含在源文件中(我知道这不是标准方式......这只是一个例子)。注意 normalcClass.cpp正在实例化 tClass<int> main.cpp也是如此.

我很好奇编译器是否每次遇到显式实例化时都必须从模板类构造实例化,考虑到它是相同的类型(即 tClass<int> )即使两者实例化发生在单独的翻译单元( normalClass.cppmain.cpp )?此外,这是否会增加编译时间(如果对上一个问题的回答是是的,它将再次实例化它,那么这也应该是是的)?

最佳答案

基本上,模板是按编译单元实例化的,这会增加编译时间。新的 C++ 标准中有一些扩展和特性来处理这个问题,比如显式实例化和外部化。有关一些解释和优化技术,请参阅此文档:

http://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html

关于c++ - 模板类是否在 C++ 的不同编译单元中编译了多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9049437/

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