

新闻资讯
技术学院预编译头(PCH)真正加速需满足:头文件稳定且被大量共用;#include "stdafx.h" 必须为首个非注释行;仅放入不变、全局、重型标准头;MSVC下用/showIncludes验证是否生效;Clang/GCC不推荐依赖PCH。
预编译头只有在头文件稳定、被大量源文件共用时才有效;盲目启用反而拖慢增量编译。关键不是“用了没”,而是“用对了没”。
#include 顺序必须严格:所有源文件中,#include "stdafx.h"(或你命名的 PCH 头)必须是第一个非注释行,否则 MSVC / Clang-cl 会直接放弃使用 PCH、、 可以,"config.h" 或含宏定义的头要谨慎——一旦修改,整个 PCH 重编,所有依赖它的 .cpp 全部重编/showIncludes,看输出里是否出现 Note: including file: ...\stdafx.h 前
有 ... precompiled header skipped 就说明没用上.gch 是 per-file 的),实际项目中建议只在 MSVC 环境下投入 PCH 优化Unity Build 把多个 .cpp 合并为一个大 TU 编译,能显著减少模板实例化和头文件重复解析,但会破坏增量编译粒度,且容易暴露隐式依赖问题。
core/ 下的 12 个 .cpp 合成一个 core_unity.cpp,而不是把 renderer/ 和 network/ 强塞一起#include 被挪到最前也不保险/Zi 且没禁用 /FS
可以,但仅限 MSVC,且必须严格分层:Unity 文件本身要 #include PCH 头,而 PCH 内不能引用任何 Unity 文件中定义的符号(比如内联函数、static 变量)。
// unity_core.cpp #include "stdafx.h" // ← 必须第一行,且 stdafx.h 已预编译 #include "a.cpp" #include "b.cpp" #include "c.cpp"
stdafx.h 包含 "core_unity.cpp" 或任何生成的 Unity 源文件路径__declspec(dllexport) 或模块接口(C++20 Modules),PCH 里不能有相关声明,否则链接阶段报 LNK2019:unresolved external symbol很多团队花两周调 PCH,却忽略更立竿见影的改进。真实项目中,以下三项往往带来 30%+ 编译时间下降,且无副作用:
#include 替代 #include "xxx.h":让编译器跳过当前目录查找,尤其在大型项目有深嵌套 include 路径时效果明显#include:用 clang++ -MJ 生成 JSON 编译数据库,再配合 include-what-you-use(IWYU)自动检测冗余头build_config.h)从公共头中剥离,改用 -D 宏传递给编译器,避免一次修改触发数百个 .cpp 重编Unity 和 PCH 是“高阶技巧”,但它们解决的是“如何更快地做重复劳动”;而删冗余头、减路径查找、拆配置头,是在直接减少劳动本身。后者见效快、风险低、可自动化验证——别急着堆编译黑科技,先打开 compile_commands.json 看看你的项目里有多少 #include "base/string_util.h" 其实根本没用到 string_util.h 里的任何东西。