编译普通/模板函数的差异,c ++

时间:2011-09-22 13:46:19

标签: c++ templates function

我在教程中读到了这个:

  

事实证明,C ++不直接编译模板函数。   相反,在编译时,编译器遇到对a的调用   模板功能,它复制模板功能并替换   具有实际类型的模板类型参数

我虽然与常规(非模板化)函数相同。 我试图理解编译器如何处理这两种函数,和 主要区别在哪里。 谢谢!

1 个答案:

答案 0 :(得分:2)

  

我虽然与常规(非模板化)函数相同。

没有。大多数编译器在编译(非static)函数时,只会为该函数发出对象代码(在进行整个程序优化时它们可能会稍后改变,但并非所有编译器都这样做)。这不是针对模板函数所做的,因为(a)那些可能不包含足以发出所有目标代码的信息,以及(b)它们可能为模板参数接受无限数量的可能值,因此编译器必须编译无限多的功能。

考虑

template <typename T>
T add1(T x)
{
    return x + 1;
}

此模板函数可以应用于T已定义operator+的任何类型int并且可以采用add1参数,并且由于您可以使用运算符重载自行创建此类型,因此可能无数的。

  

相反,在编译时,编译器遇到对模板的调用   函数,它复制模板函数并替换模板类型   具有实际类型的参数

...但链接器会注意到,如果在多个模块中对同一类型T(例如,float)使用{{1}},则编译的目标代码是相同的在每种情况下,它都会删除重复项。