OneOS物联网操作系统

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

2022-01-18  本文已影响0人  罗蓁蓁

前言

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

什么时候会用到优化?

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

什么时候不会用优化?

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

优化是否会出问题?

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

出了问题怎么办?

部分代码取消优化

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

如果是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/

上一篇 下一篇

猜你喜欢

热点阅读