繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM