模板的符号表条目

时间:2014-05-09 09:33:13

标签: c++ unix

我对模板功能有疑问。 如果我写一个像

这样的普通函数
int function1(int x);
int function1(int x, int y);

将为function1创建两个符号表条目。 每个条目代表每个重载函数。

在模板函数的情况下,编译器究竟发生了什么以及如何处理它。

template<class X>
int function1(X a);

模板函数会出现多少个符号表条目?

4 个答案:

答案 0 :(得分:3)

C ++中没有“模板函数”这样的东西。有“功能模板”,即用于创建功能的模板(或可能是蓝图)。一旦接受了这一点,答案就会变得更容易被发现。

模板纯粹是一种编译结构。从模板中实例化的每个函数(自然)都是一个函数,因此它将有自己的符号。

inline函数一样,如果在不同的翻译单元(=不同的.cpp文件)中从模板中实例化一个相同的函数(=使用相同的模板参数集),则编译器&amp;链接器必须确保将它们合并为一个,因为它们的地址必须相同。他们如何做到这一点是他们的实施细节;标准只是要求他们必须这样做。而且我担心我不知道如何做到的技术细节,所以我不能提供一个例子。

答案 1 :(得分:0)

肯定&#34;每个实例化一个&#34;。

A function template by itself is not a type, or a function, or any other entity.
No code is generated from a source file that contains only template definitions.
In order for any code to appear, a template must be instantiated: the template
arguments must be determined so that the compiler can generate an actual function

link

答案 2 :(得分:0)

使用特定模板参数创建函数模板的实例时,编译器会生成一个重载方法。所以当你使用方法时

temlate<class X>
int function1(X a);

使用

function1<int>(5);
function1<double>(5.0);

编译器生成

int function1(int a);
int function1(double a);

这些都是重载的,会有2个符号。

事实上,templatesmacro非常相似,具有强大的类型检查功能。在编译类型时,函数模板将替换为实际实例。在object代码中,不存在模板函数,只有实例化重载(如果有)。

答案 3 :(得分:0)

如果没有人使用模板创建编译函数,实际上没有条目在符号表中创建。否则,对于模板的每个不同用法(对于每种类型或类型组合 - 如果有多个类型参数),将创建一个更多的编译函数,从而创建符号表中的另一个条目。

模板仅在编译时评估;编译后,它们不再存在。