STL 带注释的源代码
STL 带注释的源代码
简介:
引言
侯捷(Hou Jie)所著的 《The Annotated STL Sources》(中文名《STL 源码剖析》)一书于 2001 年出版,至今仍是那些想了解 C++ 标准模板库内部结构的人的独特资源。与大多数解释如何使用 STL 的教科书不同,这本书展示了它在源代码层面的实现方式,并对每一段代码都附有详细的注释和说明。全书共 466 页,技术内容密集,面向已经熟悉 C++ 基础的读者。
本书内容
侯捷以 SGI(Silicon Graphics)的 STL 实现为基础——这是最流行且文档最完善的实现之一。本书就像一份源码导读:作者依次剖析了库的所有主要组件:
- 容器:vector, list, deque, set, map, unordered 版本(当时尚未纳入标准,但已存在于 SGI STL 中),以及 slist 和 rope 等特殊容器。
- 分配器:标准分配器、带有内存池的 SGI 特殊分配器、资源分配定制机制。
- 迭代器:迭代器类别、traits 类、适配器(back_insert_iterator, front_insert_iterator, istream_iterator 等)。
- 算法:从简单的(find, count)到复杂的(sort, partial_sort, nth_element, set 操作)。
- 函数对象和适配器:binder, negator, pointer_to_unary_function 等。
- 辅助机制:type traits, __type_traits, char_traits。
每一章都包含带有注释的真实代码片段(通常为中文,但在国际版本中为英文),解释代码为何如此编写、采用了哪些优化以及隐藏了哪些陷阱。
适合哪些读者
本书面向 中高级 C++ 程序员,他们已能熟练使用 STL 编写代码,但希望了解其内部工作原理。本书对以下人群尤其有用:
- 希望通过理解容器和算法“引擎盖下”的工作原理,编写更高效、更安全代码的开发者。
- 希望学习参考实现方式的 C++ 及数据结构课程的学生和教师。
- 从事性能优化的工程师——本书揭示了 SGI STL 中用于加速的许多技巧。
- 所有对 C++ 历史和标准库演变感兴趣的人。
读者将学到什么
阅读本书后,读者将能够:
- 基于实现,解释为什么 std::vector 在某些场景下比 std::list 更快,而在其他场景下更慢。
- 理解分配器的工作原理,以及为什么 SGI STL 为小对象使用单独的内存池。
- 掌握迭代器 traits 和推进(advance)机制——为什么 std::advance 对于 random_access_iterator 是 O(1),而对于 forward_iterator 是 O(N)。
- 独立阅读和分析任何现代 STL 实现(libstdc++、libc++)的源代码。
- 在自己的项目中使用元编程技术,例如模板偏特化和 type traits。
- 编写与 STL 在接口和性能上兼容的自定义容器和算法。
优点
1. 独特的格式。 本书不仅仅是重印源代码——每个代码块都附有注释,解释变量的用途、选择特定结构的原因以及标准引用。这使阅读变成与经验丰富的导师的对话。
2. 深度剖析。 作者不回避复杂主题:剖析了“小对象分配器”机制,解释了为什么在 std::sort 的实现中使用了