美文网首页OneOS物联网操作系统
那些和编译优化相关的事儿

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

作者: 罗蓁蓁 | 来源:发表于2022-01-18 10:03 被阅读0次

前言

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

什么时候会用到优化?

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

相关文章

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

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

  • jvm 相关阅读

    相关阅读 JVM性能优化1-JVM简介 JVM性能优化2-编译器 JVM性能优化3-垃圾回收 JVM性能优化4-C...

  • apk瘦身

    Proguard混淆文件中申明相关的不需要的类直接不参与编译,以及相关的瘦身优化等 Vector Drawable...

  • LLVM

    一、编译器 性能优化:启动优化、界面优化、架构优化 编译型语言:OC(编译器是clang)、C(编译器可以直接执行...

  • 参阅ButterKnife源码,对编译时注解(Annotatio

    编译时注解 运行时注解和编译时注解,两种注解方式对性能的影响是不一样的。之前看到相关资料,都说对于注解的优化,都用...

  • SQL优化的那些事儿

    熟悉并且进场使用数据库的童鞋们应该都对SQL优化这个知识点不陌生了吧!这个也是我们在技术面试时经常会被面试官问到...

  • 网站优化的那些事儿

    网站在不同阶段的优化是有所不同的,当关键词排名进入前10页对于刚建立的新站来说,网站不要做太大的调整,坚持定时定量...

  • Build settings探究之—编译优化

    Build settings探究之—编译优化 Build settings探究之—编译优化

  • 对LLVM和跨平台的理解

    广义 LLVM 架构包括编译前端 + 中间优化 + 编译后端; 狭隘 LLVM 指的就是中间优化 + 编译后端; ...

  • 晚期(运行期)优化

    HotSpot的即时编译器 解释器与编译器 编译对象与触发条件 编译过程 编译优化技术 如果还对其他的经典编译优化...

网友评论

    本文标题:那些和编译优化相关的事儿

    本文链接:https://www.haomeiwen.com/subject/iuckhrtx.html