我有一个包含所有类定义和函数的源文件.
为了更好地组织,我将类声明(.h)和实现(.cpp)移动到单独的文件中.
但是当我编译它们时,它导致比我从单个源可执行文件获得的可执行文件更慢.对于相同的输入,它大约慢20-30秒.我改变任何代码.
为什么会这样?我怎样才能让它再次变快?
更新:单个源可执行文件在40秒内完成,而多个源可执行文件需要60个.我指的是运行时而不是编译.
有几个问题讨论为什么我们应该有单独的编译单元以便改进编译时间(例如,不包括hpp文件中的任何代码,但仅包括cpp文件中的代码).
但后来我发现了这个问题:
如果我们可以忽略可维护性的问题,如果我们只看一下编译/链接时间,以及优化代码,那么只有一个hpp和cpp文件会带来什么好处和陷阱?
请注意,我链接的帖子谈论单个cpp文件(虽然有许多头文件).我问如果我们只有一个hpp文件和一个cpp文件会发生什么.....
编辑:如果我们可以忽略更改单行的事实,将导致整个代码被重新编译,它是否仍然比从头开始重新编译1000个单独的文件更快...
编辑:我对可维护性的讨论不感兴趣.我试图理解是什么让编译器编译得更快.这个问题与实际问题无关,但更多的是与理解一个简单问题有关:
一个大的hpp&cpp文件,编译速度比使用单个核心分割许多hpp和cpp文件的代码要快.
编辑:我认为人们越来越偏向于谈论什么是实际的,应该做什么.这个问题不是关于人们应该做什么 - 它只是帮助我理解编译器在幕后做了什么 - 直到现在还没有人回答这个问题,而是谈论它是否实用.
编辑:除了一个实际上试图回答这个问题的人 - 我觉得这个问题没有得到应有的正义,并且被不必要地投票.SO是关于分享信息,而不是惩罚问题,因为人们要求的人不知道答案.
我有一个C++代码,我正在使用VC7进行编译,它需要花费大量的时间来构建它.有什么方法可以描述它,并找出为什么需要时间来构建?
代码合并包括将整个源代码复制到一个文件中。
例如,它是由SQLite完成的,以减少编译时间并提高生成的可执行文件的性能。在这里,它会生成一个包含 184K 行代码的文件。
我的问题不是关于编译时间(已经在这个问题中回答),而是关于可执行文件的效率。
SQLite 开发人员说:
除了使 SQLite 更容易合并到其他项目中之外,合并还使其运行速度更快。当代码包含在单个翻译单元中(例如在合并中)时,许多编译器能够对代码进行额外的优化。当我们使用合并来编译 SQLite 而不是单个源文件时,我们测量了 5% 到 10% 的性能改进。这样做的缺点是额外的优化通常采用函数内联的形式,这往往会使生成的二进制图像的大小更大。
据我了解,这是由于过程间优化(IPO),编译器进行的优化。
GCC开发人员也这么说(感谢 @nwp 提供链接):
编译器根据它对程序的了解来执行优化。一次将多个文件编译为单个输出文件模式允许编译器在编译每个文件时使用从所有文件中获得的信息。
但是他们并没有谈论最终的收益。
除了 SQLite 的测量之外,是否有任何测量可以证实或反驳以下说法:使用 gcc 编译时,带有合并的 IPO 比不带合并的IPO 生成更快的可执行文件?
作为一个附带问题,对于此优化,进行代码合并或将所有 .cpp(或 .c)文件#include 到一个文件中是否相同?
我总是习惯#define在 cpp 文件开头的某个地方定义幻数。我想把它改成const数字。(全局变量在 cpp 文件中声明/定义。)这是个好主意吗?我应该将它们放入匿名命名空间吗?我从不#include在任何地方使用 cpp 文件。