c++中的template的问题
当我们用template写一个函数的时候,在调用时,会转换成具体的类型。我想请问的是:c++在每调用一次template所写的函数的时候都要生成新的代码吗?那如果这样的话...
当我们用template写一个函数的时候,在调用时,会转换成具体的类型。我想请问的是:c++在每调用一次template所写的函数的时候都要生成新的代码吗?那如果这样的话,不是会使生成的代码过多吗?这个问题该怎么解决呢?
展开
3个回答
展开全部
实现模板实例化是编译器的编译期行为,编译期按不同类型参数实例化模板,并且目前而言编译器一般不会有通用且有效的优化行为(因为模板中的类型参数自由度很高,编译器无法判断哪个类或函数的模板实例化版本是不需要的而可以用另一些版本代替)。因此如果调用的不同类型参数数量比较多,的确会造成很明显的代码膨胀导致最终目标文件体积明显增加。如果要减少目标文件体积,可以限制调用的类型参数的实例数,例如在不同的类之间尽可能使用继承而不是直接当作相互无关的模板类型参数(不过这样可能会略损失运行期性能,尤其是使用虚继承时;另外面向对象范型相对于泛型而言,运行期限制更多,灵活性略差,有时候可能不得不多写一些重复代码)。
至于函数调用是目标代码的运行期行为,目标代码已经生成好了(由于是本机代码,不会保存类型等元信息),和模板无关(模板在编译早期展开后就可以当作不存在了)。
====
[原创回答团]
至于函数调用是目标代码的运行期行为,目标代码已经生成好了(由于是本机代码,不会保存类型等元信息),和模板无关(模板在编译早期展开后就可以当作不存在了)。
====
[原创回答团]
参考资料: 原创
展开全部
编译时会生成,但一个模板参数只生成一份代码,
跟调用没有关系。
跟调用没有关系。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
。。。吧template<class T>后面那个分号去掉就行了。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询