一篇文章带你了解C语言中volatile关键字_C 语言

来源:脚本之家  责任编辑:小易  
目录
C语言中volatile关键字总结

C语言中volatile关键字

volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多。

当不用这个关键字的时候,CPU可能会对我们的代码做一定的优化:

内存中的数据要放入CPU中进行运算或控制,而这个数据的值是被放入寄存器中,然后再将寄存器中的数据进行运算或控制的,对于一个死循环int flag=1;while(flag);来说;如果进行优化,则下次循环则不需要再次将flag内存中的值放入寄存器中,而是直接使用寄存器中已有的值进行循环;如果不进行优化,则下次还需要将flag内存中的值放入寄存器中,然后使用寄存器中的数据。

总结起来就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对其地址的稳定访问;如果不使用valatile,则编译器将对所声明的语句进行优化。

这两种情况在单线程的情况下区别不大,但是在多线程的情况下可能会有其他逻辑将flag修改为0,如果进行优化,则死循环不会停下来。

所以volatile的作用就是让变量不要被CPU优化,达到稳定访问内存的目的。

比如下面的代码:

在这里插入图片描述

我们在gcc下使用命令gcc test.c -O2 -g将代码进行优化,然后用命令objdump -S -d a.out > a.s将优化后的汇编代码放入a.s文件中,再用vim a.s查看a.s文件:

在这里插入图片描述

程序会一直在这一句代码中死循环:

在这里插入图片描述

加入volatile后:

在这里插入图片描述

再用相同的命令查看a.s文件:

在这里插入图片描述

可以看到每次循环都会读取pass的数据。

结论: volatile 忽略编译器的优化,保持内存可见性。

另外,const和volatile是不冲突的:

const volatile int a = 10; 

const关键字要求变量a不能直接被写入,而volatile关键字要求每次读取数据的时候,都要从a所在的内存中读取,并不会改变变量a的值。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注真格学网的更多内容!

您可能感兴趣的文章:C语言中volatile关键字的深入讲解C语言中volatile关键字的作用与使用案例教程探讨C语言中关键字volatile的含义C语言 volatile与const同时使用应注意的问题

  • 本文相关:
  • c blowfish对称加密算法详解
  • c语言实现静态链表的方法
  • mfc程序设计常用技巧汇总
  • 求子数组最大和的实例代码
  • c语言 汉诺塔算法代码
  • c++连接mysql5.6的出错问题总结
  • c++基于特征向量的knn分类算法
  • c++实现leetcode(161.一个编辑距离)
  • c++设计模式之备忘录模式(memento)
  • c++迭代器失效的情况汇总
  • C语言:统计一篇英文文章中所要查询单词出现的次数以及出现的...
  • 用c语言编写的用来在一篇文章中统计每个字母的个数和比例。...
  • C语言编程 有一篇文章,共有3行文字,每行80个字符。要求分别...
  • C语言有一篇文章共十行,每行有80个字符。编写程序,统计其中...
  • C语言题目 有一篇文章,共有3行文字,每行有个80字符.要求分别...
  • C语言题目 有一篇文章,共有3行文字,每行有个80字符.要求分别...
  • 用C语言编程 统计一篇文章中大写字母,小写字母,数字,空格和其...
  • C语言题目 有一篇文章,共有3行文字,每行有个80字符.要求分别...
  • C语言问题:一篇英文文章存放在文件a.txt,输入若干单词,请统计...
  • 求助大神。C语言题目:有一篇文章,共有3行文字,每行有个80字...
  • 编写C语言能读一个由一篇英文文章构成的文本文件,可以检查其...
  • 用C语言做一个给定一篇英语文章能够统计词频,共现词频的程序
  • c语言 有有一篇文章,共有3行文字,每行有80个字符。要求分别统...
  • c语言编程:NO.1有一篇文章,共有3行文字,每行有80个字符。要...
  • C语言 请帮我分析下这个程序:有一篇文章,共有三行文字,每行有...
  • c语言编程,如何用字符数组储存一篇磁盘中的英文文档?
  • 设计一个恒温恒压供水控制系统,想了解C语言和PLC300和MA...
  • C语言中怎么显示文章的行数和列数?
  • C语言统计文章中单词的个数
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言r语言其它相关首页c 语言c语言中volatile关键字的深入讲解c语言中volatile关键字的作用与使用案例教程探讨c语言中关键字volatile的含义c语言 volatile与const同时使用应注意的问题c blowfish对称加密算法详解c语言实现静态链表的方法mfc程序设计常用技巧汇总求子数组最大和的实例代码c语言 汉诺塔算法代码c++连接mysql5.6的出错问题总结c++基于特征向量的knn分类算法c++实现leetcode(161.一个编辑距离)c++设计模式之备忘录模式(memento)c++迭代器失效的情况汇总c语言程序设计50例(经典收藏)c语言10个经典小程序c语言字符串操作总结大全(超详细c语言文件操作函数大全(超详细)c语言运算符优先级列表(超详细)c语言字符数组与字符串的使用详解c语言/c++中如何产生随机数c++中的string常用函数用法总结深入理解c++中public、protectedc++常用字符串分割方法实例汇总c语言实现简单图书管理系统c++实现大数相乘算法详解c++基础——类继承中方法重载基于c语言实现推箱子游戏python扩展c/c++库的方法(c转换为python)浅谈c语言转义字符和格式控制符深入了解c++中map用法c语言中fgets和fscanf区别详解c++17新特性个人总结c语言实现扫雷游戏源代码
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved