【发布时间】:2011-09-22 13:46:19
【问题描述】:
我在教程中读到了这个:
原来C++并没有直接编译模板函数。 相反,在编译时,当编译器遇到对 模板函数,它复制模板函数并替换 具有实际类型的模板类型参数
虽然它与常规(非模板化)函数相同。 我试图了解编译器如何处理这两种函数,以及 主要区别在哪里。 谢谢!
【问题讨论】:
我在教程中读到了这个:
原来C++并没有直接编译模板函数。 相反,在编译时,当编译器遇到对 模板函数,它复制模板函数并替换 具有实际类型的模板类型参数
虽然它与常规(非模板化)函数相同。 我试图了解编译器如何处理这两种函数,以及 主要区别在哪里。 谢谢!
【问题讨论】:
虽然它与常规(非模板化)函数相同。
没有。大多数编译器在编译(非static)函数时,只会为该函数发出目标代码(它们稍后可能会在进行全程序优化时更改,但并非所有编译器都这样做)。这不适用于模板函数,因为(a)它们可能不包含足够的信息来发出所有目标代码,并且(b)它们可能接受无限数量的可能值作为其模板参数,因此编译器必须编译无限数量的功能。
考虑
template <typename T>
T add1(T x)
{
return x + 1;
}
此模板函数可以应用于定义了operator+ 的任何类型T,并且可以接受int 参数,并且由于您可以通过运算符重载自己创建此类类型,因此它们的数量可能是无限的.
相反,在编译时,当编译器遇到对模板的调用时 函数,它复制模板函数并替换模板类型 具有实际类型的参数
...但是链接器会注意到,如果您在多个模块中对相同类型的T(例如float)使用add1,则编译的目标代码在每种情况下都是相同的,并且将删除重复项。
【讨论】: