为什么STL实现如此难以理解?C ++在这里有哪些改进之处?

43

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

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


7
你为什么关心实现细节? - David Thornley
44
你会收到很多负面评论,但我赞扬你有勇气阅读代码,并询问为什么它被编写成这样。太多的开发者不愿尝试,也不关心这些。 - Kristopher Johnson
6
很好,你读了代码!当你阅读了一定量的代码之后,STL实现就会突然变得不再晦涩难懂,而是清晰明了。 - P Shved
5
当文档未提供详细信息时,可能是因为这些细节可能会改变,所以这不是查看源代码的很好理由。在源代码中发现的任何内容,但文档中没有提到的,可能会在下一版本编译器发布时更改,因此您不应依赖它。 - jalf
4
@Pavel:确实发生了这样的事情。我整天读代码,现在它很容易阅读。此外,我学到了一些不错的C++习惯用语和模式。学习了分配器的工作原理,如何使用高级迭代器获得可读性较强的代码等等! - Łukasz Lew
显示剩余4条评论
3个回答

41

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


+1 确实。GCC的实现甚至包含了一条注释,解释为什么队列的底层容器被称为c,而没有“根据样式指南进行丑化”。 - UncleBens
3
C++可以通过加强宏系统来改进 :) - Łukasz Lew
1
这仍然不能防止用户定义的宏命名不当与类型或成员函数名称冲突(例如,#define size 2)。 - bk1e

6
许多STL实现还包括针对调试版本的检查,例如在比较两个迭代器时验证它们是否来自同一个容器,并注意迭代器越界的情况。这涉及到跟踪创建的每个迭代器的容器和有效性的相当复杂的代码,但对于找出bug非常有价值。该代码也都与标准发布代码通过#ifdef交织在一起,甚至在STL算法中也是如此。因此,它永远不会像最基本的操作那样清晰。像这个网站这样的网站展示了STL算法的最基本功能,说明它们的功能“等同于”它们展示的代码。但你的头文件中看不到这些内容。

2
除了Robson和AshleysBrain已经提到的好处,C++标准库实现具有简洁名称和紧凑代码的另一个原因是几乎每个C++程序(编译单元)都包含大量标准库头文件,并且它们因此不断重新编译(请记住,它们主要是内联和基于模板的,而C标准库头文件仅包含少量函数声明)。符合“行业标准”风格指南的标准库将需要更长时间进行编译,从而导致特定编译器被认为是“慢”的感觉。通过最小化空格并使用短标识符名称,词法分析器和解析器的工作量减少,整个编译过程完成得更快一点。
另一个值得一提的原因是许多标准库实现(例如Dinkumware,Rogue Wave(旧版本)等)可以与具有广泛不同标准兼容性和怪癖的几个不同编译器一起使用。通常会有很多宏技巧旨在满足每个支持的平台。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接