0

0

c++项目如何有效缩短编译时间? (预编译头与Unity Build)

穿越時空

穿越時空

发布时间:2026-01-12 14:30:02

|

668人浏览过

|

来源于php中文网

原创

预编译头(PCH)真正加速需满足:头文件稳定且被大量共用;#include "stdafx.h" 必须为首个非注释行;仅放入不变、全局、重型标准头;MSVC下用/showIncludes验证是否生效;Clang/GCC不推荐依赖PCH。

c++项目如何有效缩短编译时间? (预编译头与unity build)

预编译头(PCH)怎么配才真正加速?

预编译头只有在头文件稳定、被大量源文件共用时才有效;盲目启用反而拖慢增量编译。关键不是“用了没”,而是“用对了没”。

  • #include 顺序必须严格:所有源文件中,#include "stdafx.h"(或你命名的 PCH 头)必须是第一个非注释行,否则 MSVC / Clang-cl 会直接放弃使用 PCH
  • 只把**不变的、全局的、重型的**头放进 PCH: 可以,"config.h" 或含宏定义的头要谨慎——一旦修改,整个 PCH 重编,所有依赖它的 .cpp 全部重编
  • MSVC 下检查是否生效:编译时加 /showIncludes,看输出里是否出现 Note: including file: ...\stdafx.h 前有 ... precompiled header skipped 就说明没用上
  • Clang 和 GCC 不原生支持 PCH 加速多文件编译(GCC 的 .gch 是 per-file 的),实际项目中建议只在 MSVC 环境下投入 PCH 优化

Unity Build(Jumbo Build)有哪些隐藏代价?

Unity Build 把多个 .cpp 合并为一个大 TU 编译,能显著减少模板实例化和头文件重复解析,但会破坏增量编译粒度,且容易暴露隐式依赖问题。

  • 合并策略必须可控:不要全项目开启。推荐按模块分组,例如 core/ 下的 12 个 .cpp 合成一个 core_unity.cpp,而不是把 renderer/network/ 强塞一起
  • 每个 Unity 文件顶部必须显式包含它所依赖的所有头,不能靠“前面某个 .cpp 已经 include 过”——因为合并后顺序不确定,#include 被挪到最前也不保险
  • 调试信息错位:GDB / LLDB 中断点可能跳转到错误的原始文件行号;MSVC 的 PDB 通常能保持映射,但需确认构建时开了 /Zi 且没禁用 /FS
  • CI 构建机内存压力陡增:一个 500MB 的 Unity TU 可能吃掉 2GB+ RAM;若机器只有 4 核 8GB,开 4 个并行 Unity 编译大概率 OOM

预编译头 + Unity Build 能叠加使用吗?

可以,但仅限 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 源文件路径
  • 如果 Unity 文件里用了 __declspec(dllexport) 或模块接口(C++20 Modules),PCH 里不能有相关声明,否则链接阶段报 LNK2019:unresolved external symbol
  • 实践中更稳妥的做法是:PCH 服务常规编译,Unity Build 单独走一套不依赖 PCH 的构建逻辑(即 Unity 文件自己完整 include 所需头),避免耦合失效

比 PCH 和 Unity 更值得优先做的三件事

很多团队花两周调 PCH,却忽略更立竿见影的改进。真实项目中,以下三项往往带来 30%+ 编译时间下降,且无副作用:

ReRoom AI
ReRoom AI

专为室内设计打造的AI渲染工具,可以将模型图、平面图、草图、照片转换为高质量设计效果图。

下载

立即学习C++免费学习笔记(深入)”;

  • #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 里的任何东西。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

408

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1012

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

60

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

373

2025.12.29

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

6

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号