停止使用 #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 模块,以保持构建速度快、代码库整洁。
0 浏览
Back to Blog

相关文章

阅读更多 »

空指针

为什么使用 nullptr 而不是 NULL 或 0?nullptr 具有独特的类型 std::nullptr_t。由于它不是整数,重载解析可以区分空指针和整数……