你如何减less编译时间和Visual C ++项目(本地C ++)的链接时间?

你如何减less编译时间和VC ++项目(本地C ++)的链接时间?

请指定每个build议是否适用于debugging,释放或两者。

这听起来很明显,但是我们尽可能地使用前向声明,即使它需要写出types的长名称空间名称:

// Forward declaration stuff namespace plotter { namespace logic { class Plotter; } } // Real stuff namespace plotter { namespace samples { class Window { logic::Plotter * mPlotter; // ... }; } } 

这大大减less了在其他编译器上编译的时间。 确实,它适用于所有configuration:)

使用Handle / Body模式 (有时也被称为“pimpl”,“adapter”,“decorator”,“bridge”或“wrapper”)。 通过将你的类的实现隔离到你的.cpp文件中,他们只需要编译一次。 大多数更改不需要更改头文件,所以这意味着您可以进行相当大的更改,而只需要重新编译一个文件。 这也鼓励重构和编写注释和unit testing,因为编译时间减less了。 此外,您可以自动分离接口和实现的关注点,从而简化代码的界面。

如果您的构build过程中大部分.cpp文件必须包含大型复杂头文件,而且这些头文件不会经常更改,则可以对其进行预编译。 在具有典型configuration的Visual C ++项目中,这只是将它们包含在stdafx.h中的一个问题。 这个特性有其批评者,但是充分利用模板的库往往在头文件中有很多东西,预编译头文件是在这种情况下加速构build的最简单的方法。

这些解决scheme适用于debugging和发布,并专注于已经庞大而笨重的代码库。

前向声明是一个常见的解决scheme。

分布式build筑,如Incredibuild是一个胜利。

将代码从头文件下载到源文件可以工作。 小的类,常量,枚举等可能在头文件中开始,因为它可能已被用于多个编译单元,但实际上它们只能用于一个,并且可以被移动到cpp文件中。

我没有阅读但已经使用的解决scheme是拆分大标题。 如果你有一些非常大的标题,看看他们。 他们可能包含相关信息,也可能依赖于很多其他头文件。 把没有依赖于其他文件的元素,简单的结构体,常量,枚举和转发声明,并把它们从the_world.h移到the_world_defs.h 。 您现在可能会发现,您的许多源文件现在只能包含the_world_defs.h并避免包含所有这些开销。

Visual Studio也有一个“显示包含”选项,可以让你了解哪些源文件包含了许多标题,哪些标题文件是最常用的。

对于非常常见的包含,请考虑将它们放在预编译的头文件中。

我使用Unity Builds (Screencast 位于这里 )。

编译速度问题很有趣,Stroustrup在他的FAQ中有这个问题 。

我们使用Xoreax的Incredibuild在多台机器上并行运行编译。

另外一个有趣的文章从Ned Batchelder: http : //nedbatchelder.com/blog/200401/speeding_c_links.html (关于Windows上的C ++)。

我们的开发机器都是四核的,我们使用Visual Studio 2008支持并行编译。 我不确定VS的所有版本是否可以做到这一点。

我们有一个包含大约168个独立项目的解决scheme文件,在我们的四核机器上这种编译方式大约需要25分钟,而我们给夏季学生的单核笔记本电脑大约需要90分钟。 不完全可比的机器,但你有想法:)

使用Visual C ++,有一种方法,一些称为Unity,通过减less对象模块的数量,大大缩短链接时间。

这包括连接C ++代码,通常按库分组。 这当然会使编辑代码变得更加困难,除非您使用它们,否则会遇到名称空间冲突。 它阻止你使用“using namespace foo”;

我们公司的几个团队都有精心devise的系统,可以在编译时将正常的C ++文件连接起来,作为构build步骤。 链接时间的减less可能是巨大的。

另一个有用的技术是blobbing。 我认为这与Matt Shaw所描述的相似。

简而言之,您只需创build一个包含其他cpp文件的cpp文件。 你可能有两个不同的项目configuration,一个普通的和一个blob。 当然blobbing会在你的代码上加上一些限制,例如,未命名的命名空间中的类名可能会发生冲突。

一种避免在更改一个cpp文件时重新编译blob(如DavidRodríguez所提到的)中的整个代码的方法是使用最近修改的文件和其他普通blob创build的“工作”blob。

大部分时间我们在工作中使用blob,这会减less项目的构build时间,尤其是链接时间。

编译时间:
如果你有IncrediBuild,编译时间不会是一个问题。 如果您没有IncrediBuild,请尝试“统一构build”方法。 它将多个cpp文件组合到一个cpp文件中,从而缩短了整个编译时间。
链接时间:
“统一build设”的方法也有助于减less联系时间,但不多。 如何检查是否启用了“全局优化”和“LTCG”,而这些标志使得程序运行速度很快,它们会使链接变慢。
尝试closures“整体全局优化”并将LTCG设置为“默认”,链接时间可能会减less5/6。
(LTCG代表链接时间码生成)