【gcc编译优化系列】如何(不)回收未发生调用的函数


1 问题场景

大家都知道,我们在开发单片机类的嵌入式固件时,一般使用的FLASH存储空间都是比较有限的,小的可能几十KB,大一点的可能也就几百KB,可以说是寸金寸土的FLASH空间,可容不得我们半点垃圾代码。
如果我们在写代码的过程中,随便写一些没用的代码,比如一些测试代码,最后版本释放的时候,这些测试代码又没有删掉,还是参与了编译,那么势必最后这个函数的代码实现就会保留在我们的固件包里面,这样我们的固件包的bin文件大小势必会增加,这显然不是我们想要的。
另外,还有一种场景下,有些函数我们使用static修饰的局部函数,只在初始化的时候通过初始化列表的形式调用一下,比如RT-Thread的初始化实现,INIT_DEVICE_EXPORT(device_init_func),那么我们是不希望这个函数被优化掉的,否则最后会出逻辑问题。
在使用GCC作为编译器的环境下,有什么办法可以实现呢?

2 需求分析

这里的需求两点:

  1. 没有被调用的函数需要移除,不出现在最后的固件文件里面;
  2. 某些特殊的函数实现,没有被显式调用,但是需要保留它,不能被优化掉。

3 需求实现

3.1 示例代码

实现的一个示例代码如下所示,功能很简单就定义了2个没被调用的函数,一个我希望优化移除,一个我希望被

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师李肯

您的鼓励是我前进的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值