您如何缩短VC++项目(本地C ++)的编译和链接时间?
请说明每个建议是针对调试,发布还是两者都适用。
您如何缩短VC++项目(本地C ++)的编译和链接时间?
请说明每个建议是针对调试,发布还是两者都适用。
尽可能使用前向声明,即使需要写出类型所在的长名称空间。
// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }
// Real stuff
namespace plotter {
namespace samples {
class Window {
logic::Plotter * mPlotter;
// ...
};
}
}
它大幅减少了编译时间,也适用于其他编译器。确实,它适用于所有配置 :)
使用句柄/体模式(有时也称为“pimpl”,“适配器”,“装饰器”,“桥接”或“包装器”)。通过将类的实现隔离到您的.cpp文件中,它们只需要编译一次。大多数更改不需要更改头文件,因此这意味着您可以进行相当广泛的更改,而只需要重新编译一个文件。这还鼓励重构和编写注释和单元测试,因为编译时间减少了。此外,您自动分离了接口和实现的问题,因此代码的接口得到简化。
如果您的大型复杂标头文件需要在构建过程中的大多数.cpp文件中包含,并且很少更改,您可以预编译它们。在具有典型配置的 Visual C++ 项目中,这只是将它们包含在 stdafx.h 中的简单问题。该功能有其批评者,但是充分利用模板的库往往在标头中有很多内容,而预编译标头是在这种情况下加速构建的最简单方法。
这些解决方案适用于调试和发布,重点是针对已经很大且臃肿的代码库。
前置声明是一个常见的解决方案。
分布式构建,例如使用Incredibuild是一种胜利之举。
从头文件中将代码推入到源文件中可能会起作用。小型类、常量、枚举等可能最初出现在头文件中,仅仅因为它们本来可以被用于多个编译单元,但实际上只在一个单元中使用,它们可以被移动到cpp文件中。
我使用过的一种解决方案是拆分大型头文件。如果您有一些非常大的头文件,请查看它们。它们可能包含相关信息,并且还可能依赖许多其他头文件。获取没有依赖其他文件的元素...简单结构体、常量、枚举和前置声明,并将它们从the_world.h
移动到the_world_defs.h
。现在您可能会发现,很多源文件现在可以仅包含the_world_defs.h
而避免包含所有那些开销。
Visual Studio还具有“显示包含文件”的选项,可以让您了解哪些源文件包含了许多头文件,哪些头文件最常被包含。
对于非常常见的包含文件,请考虑将它们放入预编译头文件中。
我使用 Unity Builds (视频教程在此)。
还有一篇来自Ned Batchelder的有趣文章:http://nedbatchelder.com/blog/200401/speeding_c_links.html(关于Windows上的C++)。
我们的开发机器都是四核的,而且我们使用支持并行编译的Visual Studio 2008。我不确定所有版本的VS都能做到这一点。
我们有一个包含大约168个单独项目的解决方案文件,在我们的四核机器上编译需要大约25分钟,而在我们提供给暑期学生的单核笔记本电脑上需要大约90分钟。虽然这些机器不完全可比,但你可以理解其中的差别 :)