為什么要使用泛型?


為什么要使用泛型

  通過泛型可以定義類型安全的數據結構(類型安全),而無須使用實際的數據類型(可擴展)。這能夠顯著提高性能並得到更高質量的代碼(高性能),因為您可以重用數據處理算法,而無須復制類型特定的代碼(可重用)。在概念上,泛型類似於 C++ 模板,但是在實現和功能方面存在明顯差異。

  考慮一種普通的、提供傳統 Push() 和 Pop() 方法的數據結構(例如,堆棧)。在開發通用堆棧時,您可能願意使用它來存儲各種類型的實例。您可以使用基於 Object 的堆棧,這意味着,在該堆棧中使用的內部數據類型是難以歸類的 Object,並且堆棧方法與 Object 交互:

  

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

  

  基於 Object 的解決方案存在兩個問題。

  第一個問題是性能。在使用值類型時,必須boxing & unboxing。裝箱和取消裝箱都會根據它們自己的權限造成重大的性能損失,但是它還會增加托管堆上的壓力,導致更多的垃圾收集工作,而這對於性能而言也不太好。即使是在使用引用類型而不是值類型時,仍然存在性能損失,這是因為必須從 Object 向您要與之交互的實際類型進行強制類型轉換,從而造成強制類型轉換開銷。

  基於 Object 的解決方案的第二個問題(通常更為嚴重)是類型安全。因為編譯器允許在任何類型和 Object 之間進行強制類型轉換,所以您將丟失編譯時類型安全。例如,以下代碼可以正確編譯,但是在運行時將引發無效強制類型轉換異常:  

  

  您可以通過提供類型特定的(因而是類型安全的)高性能堆棧來克服上述兩個問題。對於整型,可以實現並使用 IntStack。對於字符串,可以實現 StringStack。

  遺憾的是,以這種方式解決性能和類型安全問題,會引起第三個同樣嚴重的問題 — 影響工作效率(無法重用)。編寫類型特定的數據結構是一項乏味的、重復性的且易於出錯的任務。在修復該數據結構中的缺陷時,您不能只在一個位置修復該缺陷,而必須在實質上是同一數據結構的類型特定的副本所出現的每個位置進行修復。此外,沒有辦法預知未知的或尚未定義的將來類型的使用情況,因此還必須保持基於 Object 的數據結構。

什么是泛型

  

  在一些 C++ 編譯器中,在您通過特定類型使用模板類之前,編譯器甚至不會編譯模板代碼。當您確實指定了類型時,編譯器會以內聯方式插入代碼,並且將每個出現一般類型參數的地方替換為指定的類型。此外,每當您使用特定類型時,編譯器都會插入特定於該類型的代碼,而不管您是否已經在應用程序中的其他某個位置為模板類指定了該類型。C++ 鏈接器負責解決該問題,並且並不總是有效。這可能會導致代碼膨脹,從而增加加載時間和內存足跡。

一些泛型應用

  

參考:http://msdn.microsoft.com/zh-cn/library/ms379564(VS.80).aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM