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