「生活可以更简单, 欢迎来到我的开源世界」
  1. 为什么《STL 源码剖析》是一本烂书
C++讨论
2021-08-15

C++ 弱类型

空类型

ebo

ebo 算优化,不算语义的一部分。有了 no unique address 之后才是确定的。但是 no unique address 并不是用来修饰类型的,是用来修饰成员的

cpp 没有真正意义的 ZST

但是有很多近似意义的zst

为什么《STL 源码剖析》是一本烂书

首先先说一下从这本书中能够学到什么,一般从这本书能学到的知识包含:1. 算法与数据结构;2. 工程化的算法与数据结构实现;3. 模板编程。

1 是纯粹的知识,是永恒不变的;2 和 3 都是涉及到工程的技术,既然是技术,就一定会过时。
接下来我们来一个一个讨论,首先是 1。学习算法与数据结构,最重要的是其数学证明(包含正确性与复杂度)与背后的 intuition。举个例子,学习红黑树,首先需要搞懂黑高与高度的关系,以及每个操作如何维护黑高的invaraint;然后还可以了解一下它与 2,3,4-树 的关系,因为红黑树可以看成其改造出来的。相反,只是背下来红黑树怎么转一点意义也没有。

然后我们先来说一说 3。这本书很多对于模版的处理方法都是极度过时的,这一部分也是源于 C++ 相当长一段时间没有模板类型约束系统。比如说举一个例子 vector(2, 2) 会优先匹配到 vector::vector(InputIterator, InputIterator) 而不是 vector::vector(size_type, const value_type &),书中介绍了 tag dispatch 的方法,但是 C++ 11 之后使用 enable_if 处理,代码更加清晰整洁。不过 STL 本身,这个问题的产生,是因为旧版 C++ 没有 concept,本质上应该是用 concept 做限制,但是 STL 出于兼容性考虑,永远不可能改变这个 API,只可能在 C++26 甚至更后的版本弄一个新的 container 库出来。这完全是 C++ 的糟粕,没有必要在 2021 年学这种东西,对于自己写代码,用 concept 写一个简直是轻松愉悦。

这个时序性的问题通常通过后续推出版本来解决, 不是书籍本身的毛病.

最后说一下 2,就算是在侯捷那个年代来看,他的书中也是有很多错误的。比如说他先是介绍 allocator 可以分离内存分配与构造,然后反手就在自己的 vector 中对于 POD 就直接调用 memcpy。由于第一章就是 allocator,看着网上各种博客煞有介事的分析,感觉真的十分荒谬。另外,他介绍 GCC 的 vector 的实现用了 vector_impl 和 vector_base,他却完全不明白,认为是为了更加“面向对象”,认为有点叠床架屋,增加不必要的复杂度,可见他连这段代码都没有理解。因此他的水平也是不足以进行 STL 的源码分析的。

开始有 书籍 勘误案例补充.错误足够大, 称之为烂书. 错误有几个地方, 称之为勘误.

c++标准库里面还有一个神器,平时用的

namespace std
{
#if defined(UNICODE) || defined(_UNICODE)
typedef wstring tstring;
typedef wstringstream tstringstream;
#else
typedef string tstring;
typedef stringstream tstringstream;
#endif
}
<⇧>