5

我查看了一些 STL 实现的来源(SGI、STLport、libc++),并看到了一些似乎对所有或大多数实现都通用的设计模式,但我找不到任何理由。我认为一定有一个好的共鸣,并想知道它是什么:

  1. 许多类,包括vector其他list_iterator类,被实现为 2 个类,例如list_iterator_base,具有部分功能,然后list_iterator继承list_iterator_base接口的其余部分。重点是什么?似乎可以在一节课上轻松完成。

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

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

4

1 回答 1

7

答案相当直截了当:

  1. STL 是关于泛型编程的。关键思想是不要有重复的代码。近期目标是不重复源代码,但事实证明不重复二进制代码也是有意义的。因此,STL 组件将常用部件分解并使用它们是很常见的。列表类的链接或向量的类型无关属性只是两个示例。对于向量,甚至有多个层:有些部分完全独立于类型(例如大小),有些只需要类型本身(例如,所有访问器、迭代器等),有些部分需要知道如何处理资源分配(例如,插入和销毁需要知道正在使用的分配器)。
  2. 事实证明,这std::iterator<...>并没有真正起作用:在基类中定义的类型取决于模板参数,在从这样的基类派生的类模板中不能直接访问。也就是说,类型需要使用基类进行限定,并且需要使用 . 标记为类型typename。更糟糕的是,理论上用户可以分配派生类的对象并通过指向的指针释放它们std::iterator<...>(是的,这样做很愚蠢)。也就是说,没有好处,只有潜在的缺点,即最好避免。

也就是说,我不知道有什么好的资源涵盖了实现通用库的技术。STL 实现中应用的大多数细节都是由多人独立发明的,但有关通用编程的文献仍然相对稀缺。我认为任何描述 STL 的论文实际上都没有讨论实现技术:它们通常专注于设计细节。鉴于似乎只有极少数人了解 STL 是什么,因此作者倾向于专注于描述 STL 是什么而不是如何实现它也就不足为奇了。

于 2012-11-07T22:13:28.087 回答