37

例如,为什么 STL 实现中的大多数成员都有_M_or___前缀?为什么有这么多样板代码?

C++ 缺少哪些功能可以使向量(例如)实现更清晰、更简洁?

4

3 回答 3

40

实现使用以下划线开头的名称,后跟一个大写字母或两个下划线,以避免与用户定义的宏发生冲突。这些名称在 C++ 中是保留的。例如,可以定义一个名为Typethen的宏#include <vector>。如果vector实现用作Type模板参数名称,它会中断。但是,不允许定义称为_Type(或__typetype__)的宏。因此,vector可以放心地使用这样的名称。

于 2009-09-22T16:04:30.887 回答
6

许多 STL 实现还包括检查调试版本,例如在比较两个迭代器时验证它们是否来自同一个容器,并观察迭代器是否越界。这涉及到相当复杂的代码来跟踪创建的每个迭代器的容器和有效性,但对于发现错误非常宝贵。该代码还与带有#ifdefs 的标准发布代码交织在一起——即使在STL 算法中也是如此。所以它永远不会像他们最基本的操作那样清晰。像这样的网站展示了 STL 算法的最基本功能,称它们的功能“等同于”它们展示的代码。但是,您不会在头文件中看到它。

于 2009-09-22T17:03:03.670 回答
2

除了 robson 和 AshleysBrain 已经给出的充分理由之外,C++ 标准库实现具有如此简洁的名称和紧凑的代码的一个原因是几乎每个 C++ 程序(实际上是编译单元)都包含大量标准库头文件,并且因此它们被反复重新编译(请记住,它们主要是内联的和基于模板的,而 C 标准库头文件只包含少数函数声明)。按照“行业标准”风格指南编写的标准库将需要更长的时间来编译,从而导致特定编译器“慢”的感觉。通过最小化空格和使用短标识符名称,词法分析器和解析器要做的工作更少,整个编译过程完成得更快一点。

另一个值得一提的原因是,许多标准库实现(例如 Dinkumware、Rogue Wave(旧)等)可以与几个不同的编译器一起使用,这些编译器具有广泛不同的标准合规性和怪癖。经常有很多宏骇客旨在满足每个受支持的平台。

于 2010-11-15T02:27:30.953 回答