那些和编译优化相关的事儿

前言

优化是一个神奇的事情,可化腐朽为神奇,此点金手为编译器,我常认为她是很好的人工智能,可把人类语言化为机器语言。

什么时候会用到优化?

发行的版本release一般都是二级优化的,因为优化能使可执行文件更小,执行效率更高。

什么时候不会用优化?

调试的版本debug,因为为了保证源代码和二进制代码一一对应。

优化是否会出问题?

会的,有时候不加优化,程序可以正常运行。加了优化以后,程序不可以正常运行。

出了问题怎么办?

部分代码取消优化

这种情况可最小范围的取消部分优化。我们知道,优化是通过编译参数-O0/-O1/-O2/-O3/-Os这种方式加入的。

  • 所以我们可以对某一个代码文件使用编译参数-O0,而其他代码文件仍然使用-O num的方式。但这种方式并不方便,因为它涉及到了修改编译参数,而编译参数往往是统一修改,而不是仅仅只修改某一个代码文件的编译参数。因此,有下面一种方式。
  • 使用预处理命令#pragma,在源码里面进行修改编译参数。而在源码中的编译参数会比makefile中的更高,而因此生效。

如果是gcc编译器,可以如下:

#pragma GCC push_options
#pragma GCC optimize("O0")
void func1()
{
   int a=2;
}
#pragma GCC pop_options

如果是armcc编译器,可以如下:

#pragma O0
void func1()
{
  int a=2;
}

volatile关键字

遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

简单来说就是,被volatile这个关键字声明的变量,是不会被优化,不管该文件的优化参数是-O2或者其它优化等级,队医这个变量来说,它就是-O0。这样来说,也是最小粒度的优化范围了。

void func1()
{
  volatile int a=2;
}

关注&&联系

开源轻量操作系统: https://gitee.com/cmcc-oneos/OneOS-Lite

docs文档中心: https://oneos-lite.com/

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值