编译器优化那些事儿(11):Code Size 优化综述

背景

Code Size 优化技术,又叫做代码缩减优化技术,指在代码功能不改变的前提下,对其做变换以达到减少代码体积的目的。在计算机诞生之初,内存是非常昂贵的计算资源,其容量通常十分有限,程序员为了使程序有效地加载并且运行,会严格控制代码大小并且使用大量的代码优化手段。随着计算机硬件技术的发展,CPU 效率飞速提升,存储的容量不断提升同时成本不断下降,代码体积在软件工程领域不是首要关注的问题。近些年来,随着网络技术的迅猛发展,嵌入式设备的广泛应用,代码体积又成为了业界和学术界关注的重要问题。

在嵌入式领域,产品受到硬件资源的限制,对能效、功耗以及面效非常敏感。Code Size 优化技术能够有效地应对硬件资源的限制,对产品的竞争力的提升至关重要。对当代产品而言,Code Size 优化可以为产品放入更多特性,增强竞争力;对下一代产品而言,Code Size 优化能够带来产品功耗和成本的竞争力提升。

通用优化选项

1. Os

类似于 -O2 选项的优化增加额外的代码缩减优化,详细描述可以参考:https://clang.llvm.org/docs/CommandGuide/clang.html

2. Oz

相比于 -Os 选项,该选项会应用更加激进的代码缩减优化技术,通常会获得更好的代码体积优化效果,但同时会使得程序性能有大幅度下降,详细描述同样可以参考:https://clang.llvm.org/docs/CommandGuide/clang.html

3. -Wl,--strip-all

针对输出文件,消除 symbol 信息。禁用 -g 选项也可以达到类似目的, -g 选项会导致编译器生成大量用于调试的信息存放在 section 中,从而使得输出文件体积增大。禁用 -g 选项是从来源上不生成调试的信息,从而达到消除symbol信息的目的。-Wl,--strip-all 可在链接过程中忽略输出文件的符号信息。

4. -Wl,--gc-sections

在链接阶段收集所有未引用的代码和数据,并且执行死代码消除,从而降低代码体积。该选项需要和 -ffunction-sections 或者 -fdata-sections 编译选项配合使用方可生效。

5. -fX-function-sections

-ffunction-sections 选项为源文件中的每一个函数生成单独的代码段(ELF section)。

-fno-function-sections 选项禁止为源文件中的每一个函数生成单独的代码段。

由于硬件架构有代码段对齐要求,如果使用选项 -ffunction-sections 对每一个函数单独生成代码段,每个代码段会增加 padding,从而使得整体代码段体积增加。分两个场景来看这个问题:

(1)代码中未被调用的函数比较多,可以通过 -ffunction-sections 和 -Wl,-gc-section 配合,消除未被调用的函数从而达到削减代码体积的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值