我读过模板被编译到不同的实体中,所以这意味着二进制文件的大小将与我们使用不同的函数编译它一样吗?做模板缩短源代码或二进制文件或两者的大小
回答
他们应该缩短光源尺寸(如果重复使用它们),但不是二进制大小(模板编译为每个不同的实例)。
这不同于Java泛型,其中有一个完整类型的擦除(泛型只用作类型的编译时验证)或C#,泛型被编译成特定的二进制文件,可以直接重用,无需重新编译和生成更多的代码。
的二进制文件的大小取决于你的编译器和optimasations编译器将执行elimnating redandant代码来减少代码大小。
现代编译器能够检测冗余代码,使二进制文件的大小将不会被使用模板dramaticly增加。
我的理解是,每次与模板实例类型的编译器产生的相关类,以匹配型 - 因此,如果您使用List<int>
,List<foo>
和List<float>
则实际上是三个不同List
类在遵守二进制。
编辑:
我什么都没有明确说明的是,我推断合并到一个单一的模板几类将(可能)不会降低你的二进制文件的大小,但应减少的尺寸你的来源。
你的理解是好的,并且注意到(除非你手动实例化类),只有那些实际使用的方法才会被编译。由于链接程序可以从二进制文件中删除未使用的代码,因此我没有将其添加到我的答案中,因此类似的空间优化可用于非模板代码,这没有什么差别。 +1 – 2010-07-27 08:22:26
模板一定会成为编写更通用和更短代码的一种方式。您不必编写函数n来处理不同类型的参数,而是使用参数的通用类型编写一次。
关于二进制大小,代码会为你做的模板实例产生,也就是说,当你指定一个类型。我不明白它会如何缩短二进制大小。
这取决于...如果你要实现每种类型都有一个单独的类,那么源代码的大小将减小。
作为二进制则很可能将不会看到任何显著差异,因为如果你要实现单独的类,每种类型而你没有,因为你已经使用的模板,这并不意味着该二进制文件的大小将减少,因为代码将由编译器生成(用于实例化),所以您不能有任何显着差异,因为“代码与相同”。
- 1. C++模板 - 代码的用法,二进制的大小
- 2. 缩短或拆分代码
- 3. 'code = sm_X'是否只嵌入了二进制(cubin)代码或PTX代码,或者两者都嵌入?
- 4. 压缩不包含二进制文件的源代码
- 5. JVM编译类文件到汇编源代码或二进制代码
- 6. 网站源代码控制和大设置二进制文件
- 7. 二进制文件大小
- 8. 二进制模板文件
- 9. 简化或缩减代码大小
- 10. haxe cpp - 如何将大型文本或二进制资源嵌入代码?
- 11. 如何缩短或更改此代码?
- 12. 自动缩短JS的URL或者Rails
- 13. CSV或PHP中的二进制文件
- 14. 二进制文件的Git或Subversion
- 15. 源文件与二进制文件:提供两者的目的是什么?
- 16. 可以缩短或改进此代码吗?
- 17. 压缩二进制文件
- 18. 快速信息库或.net二进制压缩开源库
- 19. 调整大小SKShapeNode帧,或者替代
- 20. .aspx.cs(代码隐藏)或BLL或两者中的验证码?
- 21. 更新TFS源代码管理中的二进制文件
- 22. 在GCC调试二进制文件中的源代码位置
- 23. Julia BinDeps:源代码和二进制文件之间的区别
- 24. 是否有可用于缩进的算法或源代码?
- 25. 非连接的dat.gui源文件与require.js。定制或模板dat.gui
- 26. PHPEclipse代码模板不正确缩进
- 27. 嵌入二进制源代码
- 28. django二进制(无源代码)部署
- 29. 源代码,二进制,列表,续行
- 30. 将源代码和二进制文件目录传递给Sonar
我怀疑编译器可以对模板做任何事情,而不是使用非模板化函数。模板具有外部链接,因此它们不能从目标文件中删除,并且可以使用任何技术来减少模板的内部代码,这些技术也将用于非模板代码。 – 2010-07-27 08:17:42