我对模板功能有疑问。 如果我写一个像
这样的普通函数int function1(int x);
int function1(int x, int y);
将为function1创建两个符号表条目。 每个条目代表每个重载函数。
在模板函数的情况下,编译器究竟发生了什么以及如何处理它。
template<class X>
int function1(X a);
模板函数会出现多少个符号表条目?
答案 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
答案 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个符号。
事实上,templates
与macro
非常相似,具有强大的类型检查功能。在编译类型时,函数模板将替换为实际实例。在object
代码中,不存在模板函数,只有实例化重载(如果有)。
答案 3 :(得分:0)
如果没有人使用模板创建编译函数,实际上没有条目在符号表中创建。否则,对于模板的每个不同用法(对于每种类型或类型组合 - 如果有多个类型参数),将创建一个更多的编译函数,从而创建符号表中的另一个条目。
模板仅在编译时评估;编译后,它们不再存在。