可以使用哪些技术来加快c++编译时间?

这个问题出现在一些关于Stack Overflow问题c++编程风格的评论中,我很有兴趣听听有什么想法。

我看到过一个相关的问题,为什么c++编译要花这么长时间?,但这并没有提供很多解决方案。


当前回答

升级你的电脑 获得一个四芯(或双四芯系统) 获得大量的内存。 使用RAM驱动器可以大大减少文件I/O延迟。(有些公司生产的IDE和SATA RAM驱动器就像硬盘驱动器一样)。 然后你有了所有其他典型的建议 如果可用,使用预编译头文件。 减少项目各部分之间的耦合。更改一个头文件通常不需要重新编译整个项目。

其他回答

网络共享将大大降低您的构建速度,因为查找延迟很高。对于像Boost这样的东西,它给我带来了巨大的不同,尽管我们的网络共享驱动器非常快。当我从网络共享切换到本地SSD时,编译一个玩具Boost程序的时间从大约1分钟缩短到1秒。

从Visual Studio 2017开始,你可以有一些编译器度量需要花费的时间。

将这些参数添加到项目属性窗口中的C/ c++ ->命令行(附加选项): /Bt+ /d2cgsummary /d1reportTime . /Bt+ /d2cgsummary /d1reportTime . /

你可以在这篇文章中获得更多信息。

尽可能使用前向声明。如果类声明只使用指向类型的指针或引用,则可以向前声明它,并在实现文件中包含该类型的头文件。

例如:

// T.h
class Class2; // Forward declaration

class T {
public:
    void doSomething(Class2 &c2);
private:
    Class2 *m_Class2Ptr;
};

// T.cpp
#include "Class2.h"
void Class2::doSomething(Class2 &c2) {
    // Whatever you want here
}

更少的包含意味着更少的预处理器工作,如果你做得足够多的话。

我将链接到我的另一个答案:如何减少Visual c++项目(原生c++)的编译时间和链接时间?我想补充的另一点是使用预编译的头文件,这经常会导致问题。但是,请只将它们用于几乎不会改变的部分(如GUI工具箱头)。否则,他们会花费你更多的时间,而不是他们最终节省你的时间。

另一个选项是,当你使用GNU make时,打开-j<N>选项:

  -j [N], --jobs[=N]          Allow N jobs at once; infinite jobs with no arg.

我通常把它设置为3,因为我这里有一个双核。然后,它将为不同的翻译单元并行运行编译器,前提是它们之间没有依赖关系。链接不能并行完成,因为只有一个链接器进程将所有目标文件链接在一起。

但是链接器本身可以被线程化,这就是GNU gold ELF链接器所做的。它是优化的多线程c++代码,据说它链接ELF对象文件的速度比旧的ld快很多(实际上包含在binutils中)。

动态链接(.so)比静态链接(.a)快得多。特别是当你的网络驱动器很慢的时候。这是因为.a文件中有所有需要处理和写入的代码。此外,需要将一个更大的可执行文件写入磁盘。