减少单个编译单元/ Unity构建的缺点

时间:2013-09-30 10:48:24

标签: c++ performance build

我正在开展一个即将变大的大型项目。在此之前,我想解决的一个问题是构建速度。

过去我们使用Single Compilation Unit / Unity Builds来大大提高构建速度。详情请见http://buffered.io/posts/the-magic-of-unity-builds/

本质上,您创建一个包含多个#include other.cpp

的.cpp文件

e.g。 scu.cpp的内容

#include apple.cpp
#include banana.cpp
#include cherry.cpp

.....

创建一个scu.obj。这降低了构建速度,因为它减少了文件I / O.

但有一些不利因素

  • .cpp中的全局变量/函数是共享的,可能会发生冲突
  • 开发人员可以忘记在.cpp&中使用#include文件。侥幸逃脱

另一个坏处是,开发人员可能需要手动维护scu.cpp(但这对我们来说是自动化的,所以不用担心)。

由于这些缺点,我们离开了SCU。但是我很想把它带回去,因为构建速度提升真的诱人(减少50-75%)。

有没有办法避免这些冲突?我测试了

scu.cpp的内容

namespace unique_1 {
#include apple.cpp
}
namespace unique_2 {
#include banana.cpp
}
namespace unique_3 {
#include cherry.cpp
}

但这只会产生错误

error C3083: 'vc_attributes': the symbol to the left of a '::' must be a type
........

源于名称空间中的#include。

还有其他选择吗?还有其他解决方案吗?

这个主题建议不(不幸的是)

Safe Unity Builds

用于测试非SCU解决方案的单独构建很容易实现。但在我们的组织内不赞成。即

  • 全局变量/函数有效(在c ++教科书中)
  • 可能会破坏SCU /非SCU而没有意识到(直到发生构建破坏)

0 个答案:

没有答案