3
在我的教程阅读此:差异
事实证明,C++不直接编译所述模板函数。 相反,在编译时,当编译器遇到一个 模板函数的调用,它复制的模板功能,并与实际类型
我虽然是与普通相同取代 模板类型参数(非模板)功能。 我想了解编译器如何处理这两种功能,并且 主要区别在哪里。 谢谢!
在我的教程阅读此:差异
事实证明,C++不直接编译所述模板函数。 相反,在编译时,当编译器遇到一个 模板函数的调用,它复制的模板功能,并与实际类型
我虽然是与普通相同取代 模板类型参数(非模板)功能。 我想了解编译器如何处理这两种功能,并且 主要区别在哪里。 谢谢!
我虽然它与常规(非模板)功能相同。
号大多数编译器,编译(非static
)功能时,会发出只针对函数对象代码(做整个程序优化时,他们可能会在以后更改,但不是所有的编译器这样做)。这不适用于模板函数,因为(a)那些可能没有足够的信息来发出所有的目标代码,并且(b)它们可能接受无限数量的模板参数的可能值,所以编译器必须编译无限的功能。
考虑
template <typename T>
T add1(T x)
{
return x + 1;
}
此模板功能可以适用于任何类型的T
为其operator+
的定义,可以采取int
参数,因为你可以使这种类型的自己与运算符重载,有一个潜在的无限他们的数量。
相反,在编译时,当编译器遇到调用模板 功能,它复制的模板函数和替换模板类型与实际类型
参数......但链接器会注意到,如果在多个模块中使用add1
对同一类型T
(比如说,float
),则编译目标代码在每种情况下都是相同的,并且它将删除重复项。