You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++ Unity构建会生成更小的二进制文件

问题

给定文件结构如下:

1.cc include common.h 
2.cc include common.h
unity_build.cc include 1.cc and 2.cc

已知编译unity_build.cc比单独编译1.cc和2.cc更快,原因是common.h仅被展开一次,整体编译代码量更少。但为何生成的二进制文件体积更小?链接器不是会移除重复符号吗?

解答

主要有这几个关键原因:

  • 内联函数的重复实例化问题
    单独编译时,common.h中的内联函数会在每个.cc文件里生成一份实例。虽然理论上链接器可以合并重复的内联实现,但实际中多数链接器不会做这个优化——尤其是内联函数体较小时,链接器会直接保留多份副本,不会花费资源去识别合并。而unity build里内联函数只被实例化一次,自然没有重复冗余。

  • 模板实例化的一致性优化
    如果common.h包含模板,单独编译时每个.cc文件都会实例化相同的模板(比如std::vector<int>)。链接器虽能处理重复模板符号,但不同编译单元生成的模板实例可能因编译选项、上下文细微差异(比如局部宏定义),导致链接器无法识别它们完全相同,最终保留多份。unity build中模板仅实例化一次,不存在这类问题。

  • 编译器全局优化的空间更大
    unity build把所有代码放在一个编译单元,编译器能做全局视角的优化:比如识别出某些函数仅内部调用,直接内联或彻底删除;或者合并相同的常量数据(如字符串字面量、常量数组)。单独编译时编译器只能看到单个.cc文件的代码,无法跨单元做这些优化,链接器也很难补全这类优化。

  • 链接器去重的局限性
    链接器的重复符号移除主要针对全局函数/变量(非static符号),但对于局部静态变量、匿名命名空间内的符号,链接器无法判断它们是否重复——这些符号作用域是单个编译单元,即使内容完全一致,链接器也会视为不同符号并保留多份。unity build里这类符号只会生成一次,自然减少了体积。

内容的提问来源于stack exchange,提问作者zcfh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:37:08