[英]differences in compiling normal/template functions, c++
我在教程中读到了这个:
事实证明,C ++不直接编译模板函数。 相反,在编译时,当编译器遇到对模板函数的调用时,它会复制模板函数并用实际类型替换模板类型参数
我虽然与常规(非模板化)函数相同。 我试图理解编译器如何处理这两种函数,以及主要区别在哪里。 谢谢!
我虽然与常规(非模板化)函数相同。
不是。大多数编译器在编译(非static
)函数时,只会为该函数发出目标代码(在进行整个程序优化时,它们可能会稍后更改,但并非所有编译器都这样做)。 这不是针对模板函数所做的,因为(a)那些可能不包含足以发出所有目标代码的信息,以及(b)它们可能为模板参数接受无限数量的可能值,因此编译器必须编译无数的功能。
考虑
template <typename T>
T add1(T x)
{
return x + 1;
}
这个模板函数可以应用于定义了operator+
任何类型T
,并且可以采用int
参数,并且由于您可以使用运算符重载自己创建这些类型,因此可能存在无限数量。
相反,在编译时,当编译器遇到对模板函数的调用时,它会复制模板函数并用实际类型替换模板类型参数
...但链接器会注意到,如果在多个模块中对相同类型T
(例如, float
)使用add1
,则编译后的目标代码在每种情况下都是相同的,并且它将删除重复项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.