为何要使用泛型?

为何要使用泛型算法

  经过泛型能够定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这可以显著提升性能并获得更高质量的代码(高性能),由于您能够重用数据处理算法,而无须复制类型特定的代码(可重用)。在概念上,泛型相似于 C++ 模板,可是在实现和功能方面存在明显差别。安全

  考虑一种普通的、提供传统 Push() 和 Pop() 方法的数据结构(例如,堆栈)。在开发通用堆栈时,您可能愿意使用它来存储各类类型的实例。您可使用基于 Object 的堆栈,这意味着,在该堆栈中使用的内部数据类型是难以归类的 Object,而且堆栈方法与 Object 交互:数据结构

  

  上述容器可按下述方式使用:性能

  

  基于 Object 的解决方案存在两个问题。blog

  第一个问题是性能。在使用值类型时,必须boxing & unboxing。装箱和取消装箱都会根据它们本身的权限形成重大的性能损失,可是它还会增长托管堆上的压力,致使更多的垃圾收集工做,而这对于性能而言也不太好。即便是在使用引用类型而不是值类型时,仍然存在性能损失,这是由于必须从 Object 向您要与之交互的实际类型进行强制类型转换,从而形成强制类型转换开销。内存

  基于 Object 的解决方案的第二个问题(一般更为严重)是类型安全。由于编译器容许在任何类型和 Object 之间进行强制类型转换,因此您将丢失编译时类型安全。例如,如下代码能够正确编译,可是在运行时将引起无效强制类型转换异常:  开发

  

  您能够经过提供类型特定的(于是是类型安全的)高性能堆栈来克服上述两个问题。对于整型,能够实现并使用 IntStack。对于字符串,能够实现 StringStack。字符串

  遗憾的是,以这种方式解决性能和类型安全问题,会引发第三个一样严重的问题 — 影响工做效率(没法重用)。编写类型特定的数据结构是一项乏味的、重复性的且易于出错的任务。在修复该数据结构中的缺陷时,您不能只在一个位置修复该缺陷,而必须在实质上是同一数据结构的类型特定的副本所出现的每一个位置进行修复。此外,没有办法预知未知的或还没有定义的未来类型的使用状况,所以还必须保持基于 Object 的数据结构。编译器

【什么是泛型】编译

  

  在一些 C++ 编译器中,在您经过特定类型使用模板类以前,编译器甚至不会编译模板代码。当您确实指定了类型时,编译器会之内联方式插入代码,而且将每一个出现通常类型参数的地方替换为指定的类型。此外,每当您使用特定类型时,编译器都会插入特定于该类型的代码,而无论您是否已经在应用程序中的其余某个位置为模板类指定了该类型。C++ 连接器负责解决该问题,而且并不老是有效。这可能会致使代码膨胀,从而增长加载时间和内存足迹。

【一些泛型应用】

  

相关文章
相关标签/搜索