【发布时间】:2010-10-27 19:12:57
【问题描述】:
对于主要包含 C++ 项目的解决方案,在 Visual Studio 2005 中加快编译时间的最佳方法是什么?
【问题讨论】:
对于主要包含 C++ 项目的解决方案,在 Visual Studio 2005 中加快编译时间的最佳方法是什么?
【问题讨论】:
除了预编译头文件之外,还有许多其他事情可能会拖慢您的速度:
编辑更多想法:
【讨论】:
*.c, *.cpp, *.h *.hpp, *.obj, *.lib, *.pch, *.ncb 添加到例外列表可以让您获得 95% 的加速,并且仍然可以捕获所有常见病毒。
您可以为通常不会经常更改的文件创建pre-compiled header。这会大大增加您的编译时间。
【讨论】:
在代码级别,最大限度地减少其他标头包含的标头数量是有帮助的。反复加载和读取文件会产生很大的影响。相反,尽可能向前声明事物。例如:
#include <iosfwd>
#include <string>
#include "M.h"
#include "R2.h"
#include "A2.h"
class M2;
class A;
class R;
template<class C> class T;
class X{
M member; // definition of M is required
M2 *member2; // forward declaration is sufficient for pointers & references
public:
// forward declaration of argument type A is sufficient
X(const A &arg);
// definition required for most std templates and specializations
X(const std::string &arg);
// forward declaration of your own templates is usually okay...
void f(T<int> t);
// unless you're defining a new one. The complete definition
// must be present in the header
template<class Z>
void whatever(){
// blah blah
}
R f(); // forward declaration of return type R is sufficient
// definitions of instantiated types R2 and A2 are required
R2 g(A2 arg){
return arg.h();
}
// ostream is forward-declared in iosfwd
friend std::ostream &operator << (std::ostream &o, const X &x);
};
如果此类的用户实际上调用了X(const A&)、f(t<int>)、f() 或operator << 中的任何一个,则必须#include 提供类定义的任何文件。
模板几乎肯定会增加包含开销。在我看来,这通常值得他们的力量。当您制作自己的模板时,完整的定义必须位于头文件中;它不能进入 cpp 文件进行单独编译。标准模板不能被前向声明,因为允许实现提供额外的模板参数(带有默认参数)并且模板的前向声明必须列出所有模板参数。 iosfwd 标头前向声明所有标准流模板和类等。只要您不实例化任何特化,就可以前向声明您自己的模板。
预编译的头文件也有帮助,但大多数编译器限制了您可以在源文件中包含的数量(Visual Studio 将您限制为一个),因此它们不是万能的。
【讨论】:
#include)。【讨论】:
如果您在大量文件中直接包含复杂的标头(例如 STL、Boost),预编译的标头会很有帮助。
确保您的构建不会无意或有意访问网络。
【讨论】:
【讨论】:
如果您的解决方案中有很多项目,请删除其中一些。如果它们被引用为项目,您可以改为引用二进制输出(使用添加引用对话框中的浏览按钮)。这消除了解决方案中的大量依赖项检查。这并不理想,但确实可以加快速度。
【讨论】:
我们使用的解决方案是IncrediBuild。只需在问题上投入更多硬件即可。除了所有开发机器(它们本身相当强大)之外,我们还有许多 4 核服务器,除了编译之外什么都不做。
【讨论】:
在 Visual stdio 顶部给出的“任何 CPU”选项上更改您的解决方案平台,那么您的程序构建速度肯定会提高。
【讨论】: