std
命名空间中,程序员不应在该命名空间内定义任何内容。当然,标准包含文件不会在标准库中产生命名冲突(因此包含标准头文件从未是问题)。那么为什么不默认包含整个标准库,而是强制程序员每次都写例如
#include <vector>
?这也将加速编译,因为编译器可以使用预先构建的符号表开始编译所有标准头文件。预先包含所有内容还可以解决某些可移植性问题:例如,当您包含
<map>
时,定义了采用哪些符号进入 std
命名空间,但不能保证其他标准符号不会加载到其中,并且例如您可能最终得到理论上可用的 std::vector
。有时程序员忘记包含一些标准头文件,但由于特定实现的包含依赖性,程序仍然可以编译。但是,将程序移动到另一个环境(或同一编译器的另一个版本)时,相同的源代码可能无法编译。
从技术角度看,我可以想象编译器只需使用
mmap
预加载标准库的最佳完美哈希符号表。这应该比加载和对单个标准头文件进行 C++ 解析更快,应该能够提供更快的查找速度以获取 std::
名称。此数据也是只读的(因此可能允许更紧凑的表示,并且可以在编译器的多个实例之间共享)。然而,这些只是理论想法,我从未实现过。
我唯一看到的缺点是我们 C++ 程序员将失去编译咖啡时间和 Stack Overflow 访问 :-)
我认为主要的优势在于程序员,尽管C++标准库是一个单一的命名空间,但他们仍需要知道哪个子部分(包括文件)包含哪个函数/类。更让人沮丧的是,当他们犯了错误并忘记包含一个文件时,代码可能会根据实现而编译或不编译(从而导致不可移植的程序)。
mmap
将预解析的数据结构加载到标准库中会比每次加载标准文件更快吗? - 6502