STL背后的设计理念

时间:2012-11-07 21:40:11

标签: c++ stl

我正在查看STL实现的几个来源(SGI,STLport,libc ++),并看到了一些似乎对所有或大多数实现都很常见的设计模式,但我找不到理由。我认为必须有一个良好的共鸣,并想知道它是什么:

  1. 许多类,包括vectorlist_iterator等,都被实现为2个类,例如list_iterator_base包含部​​分功能,然后list_iterator继承list_iterator_base与接口的其余部分。有什么意义?似乎可以在一个班级中轻松完成。

  2. 迭代器似乎没有使用iterator类。使用它会有一些性能损失吗?

  3. 这是我在快速浏览中发现的两个问题。如果有人知道一个很好的资源来解释STL实现的实现原理,我会很高兴听到它。

1 个答案:

答案 0 :(得分:7)

答案非常简单:

  1. STL就是通用编程。关键的想法是不要有重复的代码。最近的目标是没有重复的源代码,但事实证明不重复二进制代码也是有意义的。因此,STL组件将常用部件考虑在内并使用它们是很常见的。列表类的链接或向量的类型无关属性只是两个示例。对于向量,甚至有多个层:一些部分完全独立于类型(例如,大小),其他部分仅需要类型本身(例如,所有访问器,迭代器等),并且一些部分需要知道如何处理资源分配(例如,插入和销毁需要知道正在使用的分配器)。
  2. 事实证明std::iterator<...>并不真正起作用:根据模板参数在基类中定义的类型不能在从这样的基础派生的类模板中直接访问。也就是说,类型需要使用基类进行限定,并且需要使用typename标记为类型。更糟糕的是,用户理论上可以分配派生类的对象,并通过指向std::iterator<...>的指针释放它们(是的,这将是一件愚蠢的事情)。也就是说,没有任何好处,但潜在的缺点,即最好避免。
  3. 那就是说,我不知道任何有关实现通用库技术的好资源。在STL实现中应用的大多数细节是由多人独立发明的,但是关于通用编程的文献仍然相对稀少。我认为任何描述STL的论文都不会讨论实现技术:它们通常专注于设计细节。鉴于只有极少数人似乎了解STL的含义,作者倾向于专注于描述STL是什么而不是如何实现它并不是一个大惊喜。