跳转到内容

更多 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 核心惯用法:瘦模板

华夏公益教科书