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

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

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


当前回答

首先,我们必须了解c++与其他语言的不同之处。

有人说c++有太多的特性。但是,有些语言有更多的特性,它们远没有那么慢。

有人说文件的大小很重要。不,源代码行与编译时间无关。

等等,这怎么可能呢?代码行数越多,编译时间就越长,这是怎么回事?

诀窍在于很多代码行隐藏在预处理器指令中。是的。仅仅一个#include就会破坏模块的编译性能。

你看,c++没有模块系统。所有*.cpp文件都是从头编译的。因此,拥有1000 *.cpp文件意味着编译项目1000次。你还有更多?太糟糕了。

这就是为什么c++开发人员不愿意将类拆分为多个文件的原因。所有这些头文件的维护都很乏味。

那么,除了使用预编译的头文件、将所有cpp文件合并为一个文件并保持头文件的数量最小化之外,我们还能做什么呢?

c++ 20给我们带来了模块的初步支持!最终,您将能够忘记#include以及头文件带来的糟糕编译性能。碰过一个文件?只重新编译该文件!需要编译一个新的签出?以秒为单位编译,而不是以分钟和小时为单位。

c++社区应该尽快迁移到c++ 20。c++编译器开发人员应该更加关注这一点,c++开发人员应该开始测试各种编译器的初步支持,并使用那些支持模块的编译器。这是c++历史上最重要的时刻!

其他回答

Use

#pragma once

在头文件的顶部,因此如果它们在翻译单元中包含了多次,则头文件的文本只会被包含和解析一次。

我推荐《Games from Within, Indie Game Design And Programming》中的以下文章:

物理结构和c++ -第1部分:概览 物理结构和c++ -第2部分:构建时间 甚至更多的包含实验 《超人总动员》有多不可思议? 预编译头文件的处理和提供 追求完美的建造系统 追求完美的构建系统(下)

当然,它们已经很旧了——你必须用最新的版本(或你可用的版本)重新测试所有的东西,才能得到真实的结果。无论如何,这都是一个很好的创意来源。

不是关于编译时间,而是关于构建时间:

如果在工作时必须重新构建相同的文件,请使用ccache 在构建文件上 使用忍者建造而不是制造。我目前正在编译一个项目 有~100个源文件和所有缓存的ccache。使需要 5分钟,忍者不到1分钟。

你可以用-GNinja从cmake生成忍者文件。

以下是一些例子:

通过启动一个多编译作业(make -j2就是一个很好的例子)来使用所有处理器内核。 关闭或降低优化(例如,GCC使用-O1时比使用-O2或-O3时快得多)。 使用预编译的头文件。

虽然不是一个“技术”,我不知道Win32项目与许多源文件编译速度比我的“Hello World”空项目。因此,我希望这能帮助到像我这样的人。

在Visual Studio中,增加编译时间的一个选项是增量链接(/ Incremental)。它与链接时代码生成(/LTCG)不兼容,因此在进行版本构建时请记住禁用增量链接。