跳轉到內容

更多 C++ 慣用法/瘦模板

來自華夏公益教科書,開放的書籍,為開放的世界

瘦模板

[編輯 | 編輯原始碼]

當類模板為多種型別例項化時,減少目的碼重複。

其他名稱

[編輯 | 編輯原始碼]

模板是重用原始碼,而不是目的碼的方式。一個模板可以為一整類類定義。該家族中的每個被例項化的成員都需要自己的目的碼。每當例項化類或函式模板時,都會為該特定型別生成目的碼。引數化型別的數量越多,生成的目的碼就越大。編譯器只為程式中使用的類模板函式生成目的碼,但重複的目的碼仍然可能在記憶體資源不充裕的環境中成為問題。重用相同的目的碼還可以提高指令快取效能,從而提高應用程式效能。因此,減少重複的目的碼是可取的。

解決方案和示例程式碼

[編輯 | 編輯原始碼]

瘦模板慣用法用於減少重複的目的碼。目的碼級別的可重用程式碼只編寫一次,通常在基類中,並在可單獨部署的 .dll 或 .so 檔案中編譯。此基類不是型別安全的,但型別安全的“瘦模板”包裝器添加了缺少的型別安全,而不會造成太多(或任何)目的碼重複。

// Not a template
class VectorBase {
  void insert (void *); 
  void *at (int index);
};

template <class T>
class Vector<T*> // Thin template 
   : public VectorBase 
{
  inline void insert (T *t) {
     VectorBase::insert (t);
  }
  inline T *at (int index) {
     return static_cast<T*>(VectorBase::at (index));
  }
};

基類可能是“胖”的:它可能包含任意數量的程式碼。由於基類只使用非行內函數,因此它的程式碼只生成一次。但由於型別轉換被封裝在類模板中的行內函數中,因此該類對使用者來說是型別安全的。模板類是“瘦”的,因為它在每次模板例項化時不會生成太多程式碼。

已知用途

[編輯 | 編輯原始碼]

Symbian OS 很大程度上依賴於這種慣用法。例如,

template <class T> class CArrayFix : public CArrayFixBase

其中 CArrayFixBase 完成了所有工作

[編輯 | 編輯原始碼]

參考資料

[編輯 | 編輯原始碼]

Symbian 核心慣用法:瘦模板

華夏公益教科書