前言

什么时候会用到优化?

发行的版本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/

03-05 16:25