关于volatile和gcc 优化的的思考

10 篇文章 1 订阅
订阅专栏

volatile是一个特征修饰符(type specifier) volatile的作用是作为指令关键字,确保本条指令不会因 编译器的优化而省略,且要求每次直接读值。这是百度百科的介绍,那编译器是具体是怎么优化的呢。

我们知道gcc 是有O0 O1 O2 O3的优化等级的,其中O0优化最低,O3优化最高。

现在看下下面一段简单程序:

#include <stdio.h>

void task_delay(int count)
{
           count *= 50000;
            
           while(count--);
}
 
int main(int argc,char* argv[])
{
   printf("Task 0:Created!\n");
   
   printf("Task 0:Running ...\n");
   
   task_delay(1000);
   
    return 0;
}

不用优化编译下:

gcc -g  -O0 main.c

看下反汇编代码:

objdump -d a.out

看的出来最低等级的优化-O0 的执行程序task_delay函数的汇编指令非常多,性能损耗长。

现在看下O1的优化后效果:

xc@xc-virtual-machine:~$ gcc -g  -O1 main.c
xc@xc-virtual-machine:~$ objdump -d a.out

反汇编代码:

明显task_delay汇编指令比之前-O0优化的时候要少,提升了执行速度。现在在来看下-O3的优化后的反汇编代码

看的出是直接空指令返回的,且运行地址在1180在main函数是没调用,这个暂时不知道怎么回事,交给后面的自己了,哈哈。

好了上面都是准备工作,目的是告诉我们-O3能将程序优化极致。现在我们将count入参用volatile修饰,会怎样,根据百度百科的说法是不会进行优化的,我们测试下:

#include <stdio.h>

void task_delay(volatile int count)
{
           count *= 50000;
            
           while(count--);
}
 
int main(int argc,char* argv[])
{
   printf("Task 0:Created!\n");
   
   printf("Task 0:Running ...\n");
   
   task_delay(1000);
   
    return 0;
}
xc@xc-virtual-machine:~$ gcc -g  -O3 main.c
xc@xc-virtual-machine:~$ 
xc@xc-virtual-machine:~$ 
xc@xc-virtual-machine:~$ objdump -d a.out 

发现跟-O0的汇编代码一样,没进行优化。

gcc 原子操作 与 volatile
PhoneLi的专栏
08-30 2784
环境:linux  __sync_* 系列的函数,只保证原子操作。
自己写的delay函数不起作用,volatile关键字的用法
最新发布
weixin_72719048的博客
07-16 310
最近在学习ti mspm0系列的mcu,想要自己写一个delay函数,却发现编译没有问题,但烧录到单片机上却没有跑出想要的效果,这有可能是你的时间标志的变量没有声明volatile属性,就会被编译器优化掉,读值的时候读在cpu寄存器里的备份,这就导致时间标志的值没有及时更新。一个定义为volatile的变量就是说这个变量可能会被意想不到的改变,这样,编译器就不会去随便假设这个变量的值了。精确的说,优化器在用到这个变量的值的时候,必须每次都小心的重新读取这个变量的值,而不是使用保存在寄存器里面的备份。
原子操作(atomic operation)
远有青山
02-21 2万+
深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。 它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上I
c语言volatile的作用分析(一)
Alfred的博客
11-15 869
1. 背景 在嵌入式领域,我们往往有的时候需要根据一个标记 flag或者变量(全局的)来进行不同策略的程序执行。 在非编译器优化的形式下debug模式下,不会出任何问题。 但是我们对外发布的时候,往往都是 release版本,也就是进行了编译器优化,这个时候程序可能就会不同。 2. 编译器优化 c语言中,编译的步骤是先编译后链接的,那么在编译一个文件的时候,这个文件使用了外部的变量,仅仅需要声明就可以,等到链接的时候回去查找,所以编译器优化的时候,都是针对于当前文件进行优化。 编译器回去查找当前文件中那些
asm volatile内嵌汇编用法
whut_gyx的专栏
09-05 3万+
带有C/C++表达式的内联汇编格式为:   __asm__ __volatile__("InSTructiON List" : Output : Input : Clobber/Modify); 每项概念说明: _asm_ 是GCC关键字asm的宏定义:#define __asm__  asm __asm__  或asm用来声明一个内联汇编表达式,任何内联汇编表达式都是以它
关于volatile关键字的说明以及测试
08-04
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供...
Java关键字volatile和synchronized作用和区别
08-30
Java关键字volatile和synchronized作用和区别 Java关键字volatile和synchronized是Java语言中两个常用的关键字,它们都是用来解决多线程编程中的同步问题的,但它们的作用和用法却有所不同。 volatile关键字是变量...
java 中volatile和lock原理分析
08-30
2. 防止指令重排序:Java编译器和JVM为了优化性能,可能会对指令进行重排序。但是,对于volatile变量,JVM会确保其读写操作的顺序不会被改变,确保了程序的正确执行顺序。 3. 原子性:尽管volatile关键字能保证可见...
C++中volatile和mutable关键字用法详解
08-25
C++中volatile和mutable关键字用法详解 C++中volatile关键字的用法详解: volatile关键字是C++中的一种类型限定符,它用于告诉编译器该变量值是不稳定的,可能被更改。使用volatile注意事项有六点: 1. 编译器会...
C中的volatile使用方法
01-21
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会 进行编译优化,加volatile关键字的变量有关...
C语言的那些小秘密之volatile
bigloomy的专栏
07-30 3万+
volatile的重要性对于搞嵌入式的程序员来说是不言而喻的,对于volatile的了解程度常常被不少公司在招聘嵌入式编程人员面试的时候作为衡量一个应聘者是否合格的参考标准之一,为什么volatile如此的重要呢?这是因为嵌入式的编程人员要经常同中断、底层硬件等打交道,而这些都用
GCCC语言中内嵌汇编 asm __volatile__
网易搬砖选手
11-20 7万+
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。 1、简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"as
C语言volatile关键字详解
weixin_38815998的博客
11-03 2万+
1.volatile和什么有关 百度翻译是这样子翻译volatile的: 图1-1 百度翻译volatile截图 volatile属于C语言的关键字,《C Primer Puls》 是这样解释关键字的:关键字是C语言的词汇,由于编译器...
详解C/C++中volatile关键字
热门推荐
小白的逆袭
06-19 8万+
一、volatile介绍 volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。下面举例说明。在DSP开发中,经常需要等待某个事件的触发,所以经常会写出这样的程序: 这段...
gcc volatile关键字作用-实验
07-04 423
volatile的本意是“易变的” 因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不使用valatile,则编译
关键字volatile使用问题
学海无涯,回头是岸........
05-21 1376
Introduction to the Volatile Keyword 认识关键字Volatile  • 在内存中进行地址映射的设备寄存器; • 在中断处理程序中可能被修改的全局变量; • 多线程应用程序中的全局变量; 例子 (1)主程序和中断共享 static volatile int i=0; int main(void) { ... while
volatile 不可优化
05-24
在 C/C++ 中,关键字 volatile 告诉编译器该变量可能会在程序执行中被意外修改,因此编译器在对这个变量进行代码优化时必须格外小心,以确保程序的正确性。也就是说,volatile 关键字可以保证该变量不被编译器进行...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

分类专栏

  • AutoSAR 4篇
  • MCU 15篇
  • linux 移植 && 二进制 10篇
  • golang 1篇
  • ARM汇编 6篇
  • shell 3篇
  • 网络与安全 4篇
  • C/C++ 性能优化 2篇
  • QML 学习笔记 5篇
  • linux驱动 8篇
  • C/C++ 2篇
  • C/C++ 实验 11篇
  • C++ 模板 5篇
  • Effective Modern C++  2篇
  • C/C++ 组件、技巧 11篇
  • 设计模式 4篇
  • yocto 7篇
  • git 7篇
  • QT 5篇
  • 工具 2篇
  • Cmake 6篇

最新评论

  • valgrind 移植到arm64 平台上总结

    言午許、刀剑剑、南山南: 我的交叉编译工具lib里的ld-2.20.so是stripped,这个要咋整嘞,而且基本上所有库都是stripped的

  • valgrind 移植到arm64 平台上总结

    水火汪: libc-2.25.so是个链接文件吧,如果是,删掉,重新敲一遍上面的命令

  • valgrind 移植到arm64 平台上总结

    qq_40519022: 你好,我这边设置软连接时 ln -s libc-2.25.so ld-linux-aarch64.so.1 ln -s libc.so.6 libc-2.25.so 提示libc-2.25.so 已存在,想问问博主,你当时是怎么设置的表情包

  • MCU中增加版本和编译时间

    CSDN-Ada助手: 不知道 Java 技能树是否可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java

  • C/C++ 线程安全的无锁ringbuffer的实现

    juno: 可以不,可以在位置的方拿个bit来做标记 加的时候与上mask就能解决。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • OS多核多线程锁记录笔记
  • bat批处理脚本
  • Hex文件解析
2024年7篇
2023年71篇
2022年41篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水火汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码大鹏百度关键词包年推广双龙seo坂田高端网站设计坑梓SEO按天扣费吉祥SEO按天收费大浪网页设计光明网络推广福永网站优化按天收费大运高端网站设计广州SEO按天收费松岗网站seo优化横岗关键词按天计费东莞网站建设设计平湖网站优化大浪关键词排名包年推广双龙网站优化按天收费布吉关键词按天收费观澜百度seo广州关键词排名光明营销型网站建设同乐网站关键词优化大芬关键词排名包年推广西乡建设网站布吉关键词按天收费西乡阿里店铺运营东莞优化西乡至尊标王东莞营销型网站建设福田网站优化坂田营销网站歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化