首页 > 解决方案 > 进行统一构建时的内联行为(clang)

问题描述

为了优化编译时间,我想为我的嵌入式系统 (C++) 项目启用统一构建(通过 CMake)。效果很好,但我认为有一些副作用。

我观察到的一件主要事情是,与“正常”构建相比,链接的二进制文件具有不同的大小(更大)。查看 elf 文件,我注意到与另一个相比,统一构建的二进制文件中的符号更少。正如我所看到的,在编译时发生了一些内联(最初我认为内联发生在链接时?)因此,当多次使用内联函数时,二进制大小会增加。

由于统一构建会发生内联,因此运行时间也稍微短一些。

我现在担心的是,随着源代码的增长,我得到了不同的统一桶,因此内联并不是真正的确定性。

如果我的假设是正确的,有没有办法解决这个问题?

标签: c++cmakebuildclang

解决方案


先到这方面

(最初我认为内联发生在链接时?)

是编译器和上下文依赖,但一般来说,编译器和链接器都涉及到这里。

对于一般问题:

您如何为您定义 Unity 存储桶?我猜你的意思是有效的多个翻译单元。如果是这种情况,那么与“常见”构建方案没有什么不同(每个 .cpp 都指向一个翻译单元),因此您的担忧与 UnityBuild 的细节无关。作为最佳实践:如果您使用 UnityBuilds,请确保您的项目/解决方案始终适用于“常见”构建,同样适用于 UnityBuild。这意味着例如:始终避免全局使用命名空间(在 .cpp 和 .h 中),确保您不会遇到静态初始化顺序惨败(与您的问题非常相关),避免大量匿名命名空间使用案例(可悲的是我知道...),使用严格的包含保护方案等等...


推荐阅读