我在教程中读到了这个:
事实证明,C ++不直接编译模板函数。 相反,在编译时,编译器遇到对a的调用 模板功能,它复制模板功能并替换 具有实际类型的模板类型参数
我虽然与常规(非模板化)函数相同。 我试图理解编译器如何处理这两种函数,和 主要区别在哪里。 谢谢!
答案 0 :(得分:2)
我虽然与常规(非模板化)函数相同。
没有。大多数编译器在编译(非static
)函数时,只会为该函数发出对象代码(在进行整个程序优化时它们可能会稍后改变,但并非所有编译器都这样做)。这不是针对模板函数所做的,因为(a)那些可能不包含足以发出所有目标代码的信息,以及(b)它们可能为模板参数接受无限数量的可能值,因此编译器必须编译无限多的功能。
考虑
template <typename T>
T add1(T x)
{
return x + 1;
}
此模板函数可以应用于T
已定义operator+
的任何类型int
并且可以采用add1
参数,并且由于您可以使用运算符重载自行创建此类型,因此可能无数的。
相反,在编译时,编译器遇到对模板的调用 函数,它复制模板函数并替换模板类型 具有实际类型的参数
...但链接器会注意到,如果在多个模块中对同一类型T
(例如,float
)使用{{1}},则编译的目标代码是相同的在每种情况下,它都会删除重复项。