2010-07-27 54 views

回答

5

他们应该缩短光源尺寸(如果重复使用它们),但不是二进制大小(模板编译为每个不同的实例)。

这不同于Java泛型,其中有一个完整类型的擦除(泛型只用作类型的编译时验证)或C#,泛型被编译成特定的二进制文件,可以直接重用,无需重新编译和生成更多的代码。

0

的二进制文件的大小取决于你的编译器和optimasations编译器将执行elimnating redandant代码来减少代码大小。

现代编译器能够检测冗余代码,使二进制文件的大小将不会被使用模板dramaticly增加。

+0

我怀疑编译器可以对模板做任何事情,而不是使用非模板化函数。模板具有外部链接,因此它们不能从目标文件中删除,并且可以使用任何技术来减少模板的内部代码,这些技术也将用于非模板代码。 – 2010-07-27 08:17:42

2

我的理解是,每次与模板实例类型的编译器产生的相关类,以匹配型 - 因此,如果您使用List<int>List<foo>List<float>则实际上是三个不同List类在遵守二进制。

编辑:
我什么都没有明确说明的是,我推断合并到一个单一的模板几类将(可能)不会降低你的二进制文件的大小,但应减少的尺寸你的来源。

+1

你的理解是好的,并且注意到(除非你手动实例化类),只有那些实际使用的方法才会被编译。由于链接程序可以从二进制文件中删除未使用的代码,因此我没有将其添加到我的答案中,因此类似的空间优化可用于非模板代码,这没有什么差别。 +1 – 2010-07-27 08:22:26

0

模板一定会成为编写更通用和更短代码的一种方式。您不必编写函数n来处理不同类型的参数,而是使用参数的通用类型编写一次。

关于二进制大小,代码会为你做的模板实例产生,也就是说,当你指定一个类型。我不明白它会如何缩短二进制大小。

2

这取决于...如果你要实现每种类型都有一个单独的类,那么源代码的大小将减小。

作为二进制则很可能将不会看到任何显著差异,因为如果你要实现单独的类,每种类型而你没有,因为你已经使用的模板,这并不意味着该二进制文件的大小将减少,因为代码将由编译器生成(用于实例化),所以您不能有任何显着差异,因为“代码与相同”。

相关问题