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

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

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


当前回答

我有个关于使用内存驱动器的主意。事实证明,对于我的项目来说,这并没有太大的区别。但它们仍然很小。试一试!我很想知道这有多大帮助。

其他回答

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

例如:

// 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
}

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

更大的内存。

有人在另一个回答中谈到了RAM驱动器。我用80286和Turbo c++(显示年龄)做到了这一点,结果是惊人的。就像机器崩溃时数据丢失一样。

你的时间都花在哪里了?你的CPU受限吗?内存约束?磁盘绑定?你能使用更多的内核吗?更多的内存?是否需要RAID?您只是想提高当前系统的效率吗?

在gcc/g++下,您查看过ccache了吗?如果你在做清洁,这是有帮助的;做很多。

一旦您应用了上面所有的代码技巧(前向声明、将公共头中的头包含减少到最低限度、使用Pimpl将大多数细节推入实现文件中……),并且在语言方面没有任何其他收获,那么考虑您的构建系统。如果您使用Linux,请考虑使用distcc(分布式编译器)和ccache(缓存编译器)。

第一个函数distcc在本地执行预处理器步骤,然后将输出发送到网络中第一个可用的编译器。它要求网络中所有配置节点的编译器和库版本相同。

后者ccache是编译器缓存。它再次执行预处理器,然后检查内部数据库(保存在本地目录中),该预处理器文件是否已经用相同的编译器参数编译过。如果是,它只弹出编译器第一次运行时的二进制文件和输出。

这两种方法可以同时使用,这样如果ccache没有本地副本,它可以通过网络将副本发送到带有distcc的另一个节点,或者它可以只注入解决方案而不进行进一步处理。

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