前言
优化是一个神奇的事情,可化腐朽为神奇,此点金手为编译器,我常认为她是很好的人工智能,可把人类语言化为机器语言。
什么时候会用到优化?
发行的版本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/