差异

2011-09-22 48 views
3

在我的教程阅读此:差异

事实证明,C++不直接编译所述模板函数。 相反,在编译时,当编译器遇到一个 模板函数的调用,它复制的模板功能,并与实际类型

我虽然是与普通相同取代 模板类型参数(非模板)功能。 我想了解编译器如何处理这两种功能,并且 主要区别在哪里。 谢谢!

回答

2

我虽然它与常规(非模板)功能相同。

号大多数编译器,编译(非static)功能时,会发出只针对函数对象代码(做整个程序优化时,他们可能会在以后更改,但不是所有的编译器这样做)。这不适用于模板函数,因为(a)那些可能没有足够的信息来发出所有的目标代码,并且(b)它们可能接受无限数量的模板参数的可能值,所以编译器必须编译无限的功能。

考虑

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

此模板功能可以适用于任何类型的T为其operator+的定义,可以采取int参数,因为你可以使这种类型的自己与运算符重载,有一个潜在的无限他们的数量。

相反,在编译时,当编译器遇到调用模板 功能,它复制的模板函数和替换模板类型与实际类型

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