尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
C++ 加快编译速度的方法
C 的主要优点是高性能但是说起编译速度却只有低调的份了。如果不加以重视编译速度极有可能会成为开发过程中的一个瓶颈。那么为什么C它就编译的这么慢呢我想最重要的一个原因应该是C基本的头文件-源文件的编译模型每个源文件作为一个编译单元可能会包含上百甚至上千个头文件而在每一个编译单元这些头文件都会被从硬盘读进来一遍然后被解析一遍。每个编译单元都会产生一个obj文件然后所以这些obj文件会被link到一起并且这个过程很难并行。这里问题在于无数头文件的重复load与解析以及密集的磁盘操作。下面从各个角度给出一些加快编译速度的做法主要还是针对上面提出的这个关键问题。1. 代码角度1.1. 在头文件中使用前置声明而不是直接包含头文件不要以为你只是多加了一个头文件由于头文件的被包含特性这种效果可能会被无限放大。所以要尽一切可能使头文件精简。很多时候前置申明某个namespace中的类会比较痛苦而直接include会方便很多千万要抵制住这种诱惑类的成员函数参数等也尽量用引用指针为前置声明创造条件。1.2. 使用Pimpl模式Pimpl全称为Private Implementation。传统的C的类的接口与实现是混淆在一起的而Pimpl这种做法使得类的接口与实现得以完全分离。如此只要类的公共接口保持不变对类实现的修改始终只需编译该cpp同时该类提供给外界的头文件也会精简许多。1.3. 高度模块化模块化就是低耦合就是尽可能的减少相互依赖。这里其实有两个层面的意思。一是文件与文件之间一个头文件的变化尽量不要引起其他文件的重新编译二是工程与工程之间对一个工程的修改尽量不要引起太多其他工程的编译。这就要求头文件或者工程的内容一定要单一不要什么东西都往里面塞从而引起不必要的依赖。这也可以说是内聚性吧。以头文件为例不要把两个不相关的类或者没什么联系的宏定义放到一个头文件里。内容要尽量单一从而不会使包含他们的文件包含了不需要的内容。记得我们曾经做过这么一个事把代码中最hot的那些头文件找出来然后分成多个独立的小文件效果相当可观。其实我们去年做过的refactoring把众多DLL分离成UI与Core两个部分也是有着相同的效果的 - 提高开发效率。1.4. 删除冗余的头文件一些代码经过上十年的开发与维护经手的人无数很有可能出现包含了没用的头文件或重复包含的现象去掉这些冗余的include是相当必要的。当然这主要是针对cpp的因为对于一个头文件其中的某个include是否冗余很难界定得看是否在最终的编译单元中用到了而这样又可能出现在一个编译单元用到了而在另外一个编译单元中没用到的情况。之前曾写过一个Perl脚本用来自动去除这些冗余的头文件在某个工程中竟然去掉多达了5000多个的include。1.5. 特别注意inline和template这是C中两种比较先进的机制但是它们却又强制我们在头文件中包含实现这对增加头文件的内容从而减慢编译速度有着很大的贡献。使用之前权衡一下。2. 综合技巧2.1. 预编译头文件 (PCH)把一些常用但不常改动的头文件放在预编译头文件中。这样至少在单个工程中你不需要在每个编译单元里一遍又一遍的load与解析同一个头文件了。2.2. Unity BuildUnity Build做法很简单把所有的cpp包含到一个cpp中 (all.cpp)然后只编译all.cpp。这样我们就只有一个编译单元这意味着不需要重复load与解析同一个头文件了同时因为只产生一个obj文件在链接的时候也不需要那么密集的磁盘操作了,估计能有10x的提高看看这个视频感受一下其做法与速度吧。2.3. ccachecompiler cache通过cache上一次编译的结果使rebuild在保持结果相同的情况下极大的提高速度。我们知道如果是build系统会对比源代码与目标代码的时间来决定是否要重新编译某个文件这个方法其实并不完全可靠比如从svn上拿了上个版本的代码而ccache判断的原则则是文件的内容相对来讲要可靠的多。很可惜的是Visual Studio现在还不支持这个功能 - 其实完全可以加一个新的命令比如cache build介于build与rebuild之间这样rebuild就可以基本不用了。2.4. 不要有太多的Additional Include Directories编译器定位你include的头文件是根据你提供的include directories进行搜索的。可以想象如果你提供了100个包含目录而某个头文件是在第100个目录下定位它的过程是非常痛苦的。组织好你的包含目录并尽量保持简洁。3. 编译资源要提高速度要么减少任务要么加派人手前面两个方面讲得都是减少任务而事实上在提高编译速度这块加派人手还是有着非常重要的作用的。3.1. 并行编译编译的时候指定使用多核买个4核的或者8核的cpu每次一build就是8个文件并行着编那速度看着都爽。3.2. 更好的磁盘我们知道编译速度慢很大一部分原因是磁盘操作那么除了尽可能的减少磁盘操作我们还可以做的就是加快磁盘速度。比如上面8个核一块工作的时候磁盘极有可能成为最大的瓶颈。买个15000转的磁盘或者SSD或者RAID0的总之越快越好。3.3. 分布式编译一台机子的性能始终是有限的利用网络中空闲的cpu资源以及专门用来编译的build server来帮助你编译才能从根本上解决我们编译速度的问题想想原来要build 1个多小时工程的在2分钟内就能搞定你就知道你一定不能没有它 - Incredibuild。3.4. 并行其实还可以这么做这是一个比较极端的情况如果你用了Incredibuild对最终的编译速度还是不满意怎么办其实只要跳出思维的框架编译速度还是可以有质的飞跃的 - 前提是你有足够多的机器假设你有solution A和solution BB依赖于A所以必须在A之后Build B。其中AB Build各需要1个小时那么总共要2个小时。可是B一定要在A之后build吗跳出这个思维框架你就有了下述方案同时开始build A和B。A的build成功这里虽然B的build失败了但都只是失败在最后的link上。重新link B中的project。这样通过让A的build与B的编译并行最后link一下B中的project4. 分拆文件在开发过程中经常遇到这样的情况在某段时间内需要只在某个文件上开发或者调试。如果该文件比较大或者依赖该文件的文件比较多则每次哪怕只改动一行编译时间都可能很长。解决这种问题的方法是把该文件分拆成多个文件让比较稳定的部分独立成一个文件变动比较大的部分独立成一个文件。这种方法有时可能违背代码设计模式的原则所以只能用于调试或者开发中的不稳定阶段。参考文献如何加快C代码的编译速度_weixin_34111819的博客-CSDN博客
RELATED

相关推荐

如何让ChatGPT写出导师认可的引言段?——5分钟重构Prompt结构,实现学术语义精准对齐(附CiteSpace验证图谱)

如何让ChatGPT写出导师认可的引言段?——5分钟重构Prompt结构,实现学术语义精准对齐(附CiteSpace验证图谱)

更多请点击: https://intelliparadigm.com 第一章:引言段学术价值与ChatGPT生成困境诊断 学术写作的引言段承担着界定研究边界、锚定理论坐标、揭示知识缺口的核心功能,其逻辑密度与概念精确性直接决定论文的学术可信度。然而,当…

📅 2026/10/22 18:25:40
Unity NGO多人游戏网络问题排查:从连接失败到同步优化的全链路指南

Unity NGO多人游戏网络问题排查:从连接失败到同步优化的全链路指南

1. 项目概述:当你的多人游戏世界“卡壳”了做多人联机游戏,最怕什么?不是玩法不够新颖,也不是美术资源不够华丽,而是当你和朋友们兴致勃勃地点击“开始游戏”后,屏幕上弹出的不是激战的场景,而是…

📅 2026/10/22 18:20:48
Python GUI 编程库 tkinter

Python GUI 编程库 tkinter

tkinter (Tk interface) 是Python的标准GUl库,支持跨平台的GUl程序开发。tkinter适合小型的GUl程序编写,也特别适合初学者学习GUl编程。 Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Python 接口…

📅 2026/10/2 20:49:09
MORE NEWS

更多资讯

📰

从零编写Linux 0.11中断机制:CPU如何响应外部事件?

从零编写Linux 0.11的系列写到这一章,系统已经能启动、能进保护模式、能打印字符了。但说实话,这时候的内核顶多算个“大号引导程序”——因为CPU还在傻乎乎地按顺序执行指令。外部设备来了数据它不知道,定时器走了它不知道,连程序…

📰

GROMACS蛋白质-小分子模拟的物理约束闭环与拓扑一致性

简介:本资源是一份面向计算生物学与药物设计初学者的GROMACS分子动力学实战学习笔记,聚焦蛋白质-小分子复合物在溶剂化环境下的完整模拟流程与数据分析方法,解决用户从零搭建NPT平衡体系、选择适配力场与水模型、生成拓扑与索引文件、执行动力…

📰

Jar包冲突实战排查:从Correct the classpath到依赖树定位与修复

前两周有个项目启动时直接抛出一个看着特别眼熟的异常,日志最后一行清清楚楚写着:Correct the classpath of your application so that it contains a single, compatible version of。说实话,看到 "classpath"、"single comp…

📰

自建Web SSH:用Termix把SSH会话搬进浏览器,随时随地远程运维

说个最近的遭遇:人在外面,手机上收到服务器告警,磁盘快满、日志刷屏、进程被挤出。我身边没电脑,手机上的终端客户端在那种情况下根本用不上。折腾了半天,我下决心给自己搭一套能放在浏览器里、随时随地打开就能连的 W…

📰

控制台贪吃蛇从能跑到能玩:环形数组、状态机与定点重绘实战

上一篇文章,我们把控制台贪吃蛇最基础的版本跑通了:蛇能动、食物能刷、撞墙能结束。但那个版本距离“一个能玩的游戏”还差得远。如果你真把它拿给朋友试玩,多半会被吐槽三件事:按键卡顿、画面闪烁、蛇稍微一长就找不着头在哪。这…

📰

碰碰好评卡核心功能实现逻辑与落地部署实战及常见问题排查指南

在电商用户运营场景中,碰碰好评卡是一种轻量化的用户反馈激励工具,通过权益激励引导消费者提交真实购物评价,帮助商户提升店铺权重与商品转化率。本文从技术视角出发,完整讲解碰碰好评卡的架构设计、核心功能实现、多端部署流程以…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬