停止使用 #include <bits/stdc++.h>。你的编译器会感谢你的!
发布: (2026年3月7日 GMT+8 17:45)
3 分钟阅读
原文: Dev.to
Source: Dev.to
旧方式:四步编译过程
源代码 (.cpp)
你编写的代码。
预处理 (.i)
预处理器扫描 #include 指令。当它看到 #include <bits/stdc++.h> 时,会打开该头文件,将所有行复制并直接粘贴到你的翻译单元中。
编译 (.obj / .o)
编译器将这段巨大的文本翻译成汇编代码,再生成机器码。
链接 (.exe / .out)
链接器把目标文件拼接在一起,并将对标准库实际逻辑的引用解析出来。
注意:
.exe是 Windows 上常见的可执行文件;.out(或没有扩展名的二进制文件)在 macOS/Linux 上常见。
为什么 #include <bits/stdc++.h> 有问题
bits/stdc++.h会一次性引入 数百 个头文件。- 对于比如有 50 个源文件的项目,预处理器会把同样的数万行代码 复制 50 次。
- 即使是一个简单的
#include <bits/stdc++.h>,也会拉进<iostream>、<vector>、<algorithm>等子头文件,导致编译器需要解析的文本量激增。
对执行、二进制大小和编译时间的影响
| 方面 | bits/stdc++.h 的影响 |
|---|---|
| 执行时间 | 无 – 未使用的代码会被优化器消除。 |
| 二进制大小 | 无 – 只有实际使用的符号会进入最终二进制。 |
| 编译时间 | 显著 – 编译器会反复解析大量头文件文本。 |
现代方式:C++20/23 模块
不再使用传统的 #include 链,你可以写:
import std; // 替代所有传统头文件,如 <iostream>、<vector>、<algorithm>,…示例
import std;
int main() {
std::vector<int> prices = {4500, 1200, 8900, 2300};
std::ranges::sort(prices);
std::cout << "Sorted prices\n";
}- 模块(内存映射): 第一次导入时会通过
mmap将二进制模块加载到 RAM。后续的导入会映射同一块内存区域,避免重复的磁盘访问。
结论
#include <bits/stdc++.h>不影响 运行时性能或二进制大小,额外的编译时间对小程序通常只有几秒。- 对于 大规模项目,这部分开销会变得明显。建议使用选择性的、显式的头文件,或更好地采用 C++20/23 模块,以保持构建速度快、代码库整洁。