gpt4 book ai didi

c++ - 模板的编译是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 21:38:43 31 4
gpt4 key购买 nike

我正在阅读一本关于模板如何工作的书,但我很难理解对模板的解释。

它说

When the compiler sees the definition of a template, it does not generate code. It generates code only when we instantiate a specific instance of the template. The fact that code is generated only when we use a template (and not when we define it) affects how we organize our source code and when errors are detected...To generate an instantiation, the compiler needs to have the code that defines a function template or class template member function. As a result, unlike non-template code, headers for templates typically include definitions as well as declarations.

“生成代码”到底是什么意思?我不明白编译函数模板或类模板与常规函数或类相比有什么不同。

最佳答案

编译器生成模板类实例化中给出的特定类型的代码。

如果你有一个模板类声明,例如

template<typename T>
class Foo
{
public:
T& bar()
{
return subject;
}
private:
T subject;
};

只要你有例如以下实例

Foo<int> fooInt;
Foo<double> fooDouble;

这些将有效地生成与您定义的类相同的可链接代码

class FooInt
{
public:
int& bar()
{
return subject;
}
private:
int subject;
}

class FooDouble
{
public:
double& bar()
{
return subject;
}
private:
double subject;
}

并实例化变量,如

FooInt fooInt;
FooDouble fooDouble;

关于模板definitions (不要与 declarations 混淆,无论模板如何)需要与头文件(包含)一起查看,原因很清楚:
编译器无法在没有看到 definition 的情况下生成此代码。 .它可以引用在链接阶段首先出现的匹配实例。

What does a non-template member function have that allows for it tobe defined outside of the header that a template function doesn'thave?

非模板类/成员/函数的声明为链接器提供了预定义的入口点。该定义可以从编译后的目标文件 (== .cpp == compilation unit ) 中看到的单个实现中得出。
相反,模板化类/成员/函数的声明可以从给定相同或不同模板参数的任意编译单元实例化。这些模板参数的定义至少需要查看一次。它可以是通用的,也可以是专用的。

请注意,无论如何,您都可以为特定类型专门化模板实现(包含在标题中或特定的 compilation unit 中)。如果您想在您的 compilation units 之一中为您的模板类提供特化,并且不要将模板类与非专业类型一起使用,这也足以将它们链接在一起。

我希望这个示例有助于阐明编译器的不同之处和所做的努力。

关于c++ - 模板的编译是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798325/

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