c++ - 进行统一构建时的内联行为(clang)
问题描述
为了优化编译时间,我想为我的嵌入式系统 (C++) 项目启用统一构建(通过 CMake)。效果很好,但我认为有一些副作用。
我观察到的一件主要事情是,与“正常”构建相比,链接的二进制文件具有不同的大小(更大)。查看 elf 文件,我注意到与另一个相比,统一构建的二进制文件中的符号更少。正如我所看到的,在编译时发生了一些内联(最初我认为内联发生在链接时?)因此,当多次使用内联函数时,二进制大小会增加。
由于统一构建会发生内联,因此运行时间也稍微短一些。
我现在担心的是,随着源代码的增长,我得到了不同的统一桶,因此内联并不是真正的确定性。
如果我的假设是正确的,有没有办法解决这个问题?
解决方案
先到这方面
(最初我认为内联发生在链接时?)
是编译器和上下文依赖,但一般来说,编译器和链接器都涉及到这里。
对于一般问题:
您如何为您定义 Unity 存储桶?我猜你的意思是有效的多个翻译单元。如果是这种情况,那么与“常见”构建方案没有什么不同(每个 .cpp 都指向一个翻译单元),因此您的担忧与 UnityBuild 的细节无关。作为最佳实践:如果您使用 UnityBuilds,请确保您的项目/解决方案始终适用于“常见”构建,同样适用于 UnityBuild。这意味着例如:始终避免全局使用命名空间(在 .cpp 和 .h 中),确保您不会遇到静态初始化顺序惨败(与您的问题非常相关),避免大量匿名命名空间使用案例(可悲的是我知道...),使用严格的包含保护方案等等...
推荐阅读
- swift - 避免 Swift 中函数指针的保留循环
- c# - 通过垂直拖动手指滚动背景
- c# - 如何使用 NinjectModule 加载 Coucbase 扩展
- ruby - 在 GNU/Linux 中使用 Ruby 进行 IO 重定向
- javascript - 在D3 js中通过给定方向移动一条线?
- node.js - 如何使用时间间隔和执行 HTTP 发布的表单实现自动保存?
- primefaces - 使用带有 Hazelcast 的 Spring-Session 集群时 ViewScoped bean 的意外行为
- php - 无法使用 PHP 和 DOM 从网站获取数据
- java - Spring Boot Thymeleaf“找不到模板位置”
- excel - 用户定义的函数到 VLOOKUP 与动态路径到关闭的工作簿(不打开它)