广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中volatile关键字的深入讲解
  • 780
分享到

C语言中volatile关键字的深入讲解

2024-04-02 19:04:59 780人浏览 泡泡鱼
摘要

1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储

1. 什么是volatile关键字?

volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取存储数据,不做优化,在我们做嵌入式开发的时候,该关键字作用很大,因为有时变量地址有可能是系统的一个外设地址,他的值的变化并不在程序控制范围内,随时有可能变化,因此需要对他进行声明,每次读取或者存储直接对地址进行操作,而不经过其他中间商,下面我以一个例子来分析vilatile的作用:

2. GCC优化等级

在看例子前先了解一下GCC的优化概念,通常C语言的编译器使用的是GCC编译器,他有个以下几个等级的优化

  • -O0 :(默认):没有优化。
  • -O或-O1 :优化,但不要花费太多的时间。
  • -O2 :更积极地优化
  • -O3 :最积极地优化
  • -Ofast :最高级的优化
  • -Os : 优化代码大小
  • -Og :在尽量不干扰调试的情况下优化

开启不同的优化等级,程序编译后的结果就会发生一定的变化,而volatile就是在开启优化的情况下使用,保护变量不被优化

3.volatile声明变量测试

我们先写一段c程序


#include <stdio.h>
int main(void)
{
    volatile int i=0;
    i=1;
    i=2;
    i=3;
    printf("%d",i);
    return 0;
}

程序创建一个变量i,对i进行三次赋值,使用-O默认优化等级对代码进行编译,查看汇编结果,我们可以看到优化后,i=1和i=2被优化,没有生成之间汇编代码,直接取最后的值寻址赋值给i

当我们使用Volatile声明变量后


#include <stdio.h>
int main(void)
{
    volatile int i=0;
    i=1;
    i=2;
    i=3;
    printf("%d",i);
    return 0;
}

编译如下,可以看到变量i的每一个赋值都生成了汇编代码,没有被优化,每次赋值都重新寻址赋值

当我们使用volatile对一个映射到外部寄存器的地址进行声明后,如果像上面连续赋值来传数据给外部寄存器,使用volatile声明就可以保护指令不会被优化,程序实现正常功能,当然除了用于对寄存器的保护外,volatile有时也使用在多线程间共享变量的保护,如果不注意,编译器会认为变量只在当前函数使用而进行优化,在其他任务中进行的改变就变的无效;如果中断中改变一个状态变量给其他函数进行检测,如果没有加volatile进行声明,也可以会因为编译器的优化而无效,所以大家在以上三种情况下使用变量时可以结合编译器的优化等级考虑一下,是不是需要将变量声明一下volatile关键字!!!

总结

到此这篇关于C语言中volatile关键字的文章就介绍到这了,更多相关C语言volatile关键字内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言中volatile关键字的深入讲解

本文链接: https://www.lsjlt.com/news/131494.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2022-11-12
  • 深入理解volatile关键字
    深入理解volatile关键字1.volatile与可见性都知道volatile可以保证可见性,那么到底是如何保证的呢?这便于Happen-before原则有关,该原则的第三条规定:对一个volatile修饰的变量,写操作要早于对这个变量的...
    99+
    2016-01-14
    java教程 volatile java
  • C语言中volatile关键字怎么用
    这篇文章主要介绍了C语言中volatile关键字怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.前言编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整...
    99+
    2023-06-20
  • C语言详细分析讲解关键字const与volatile的用法
    目录一、const 只读变量二、const 全局变量的分歧三、const 的本质四、const 修饰函数参数和返回值五、volatile 解析六、小结一、const 只读变量 con...
    99+
    2022-11-13
  • C语言中volatile 关键字有什么用
    这期内容当中小编将会给大家带来有关C语言中volatile 关键字有什么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、关键字 volatile 是什么volatile是一个类型修饰符(type sp...
    99+
    2023-06-16
  • 深入聊聊C语言中的Const关键字
    目录前言01const简述02常量的应用常量作为函数的参数C++中应用加const03#define和const总结前言 const是一个C语言的关键字,它限定一个变量不允许被改变。...
    99+
    2022-11-13
  • C语言中volatile关键字的详细介绍
    这篇文章主要讲解了“C语言中volatile关键字的详细介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中volatile关键字的详细介绍”吧!1. 什么是volatile关键字?v...
    99+
    2023-06-20
  • C语言关键字const与volatile怎么用
    今天小编给大家分享一下C语言关键字const与volatile怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、con...
    99+
    2023-06-30
  • C语言深入讲解之从函数栈帧角度理解return关键字
    目录初识函数栈帧return个人总结环节初识函数栈帧 如上图可见,函数在被调用的时候会现在栈上开辟一个空间,我们称之为栈帧,之后函数内部的变量在这块区域进行空间开辟。 但是函数在调...
    99+
    2022-11-12
  • 深度理解C语言中的关键字static
    目录一、函数和变量的多文件问题1.1.为什么全局变量和函数需要跨文件访问二、static修饰变量和函数2.1.static修饰全局变量2.2.static修饰局部变量2.3.为什么局...
    99+
    2022-11-12
  • C语言volatile关键字的作用与示例
    目录写在前面volatile和内联汇编的volatile的选择写在前面 版本信息:Linux操作系统,x86架构,Linux操作系统下GCC9.3.1版本。GCC 9.3.0手册。 ...
    99+
    2023-05-15
    C语言volatile关键字 C语言volatile
  • C语言volatile关键字的作用是什么
    本篇内容介绍了“C语言volatile关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面版本信息:Linux操作系统,...
    99+
    2023-07-06
  • 一篇文章带你了解C语言中volatile关键字
    目录C语言中volatile关键字总结C语言中volatile关键字 volatile关键字是C语言中非常冷门的关键字,因为用到这个关键字的场景并不多。 当不用这个关键字的时候,CP...
    99+
    2022-11-12
  • C++深入讲解namespace与string关键字的使用
    目录namespace1.为什么使用namespace2.namespace的定义3.namespace的使用4.使用using指示符string1.string的定义及初始化2.访...
    99+
    2022-11-13
  • C++深入讲解new与deleted关键字的使用
    目录可执行程序的虚拟地址空间1.new的运算符用法(关键字)2.new的函数用法3.定位new4.new创建对象5.delete6.对于内置类型new/delete/malloc/f...
    99+
    2022-11-13
  • c++中的volatile和variant关键字详解
    目录一、两个长得有点像的变量二、二者的功能三、应用实例四、总结一、两个长得有点像的变量 对volatile关键字,其实很多人只是能用,知道用到啥处,但其实应用的原理并不知道。在一些多...
    99+
    2022-11-13
  • Java并发编程之关键字volatile的深入解析
    目录前言一、可见性二、有序性总结前言 volatile是研究Java并发编程绕不过去的一个关键字,先说结论: volatile的作用:       &n...
    99+
    2022-11-12
  • Java深入讲解instanceof关键字的使用
    目录instanceof关键字的使用1. 语法格式2. 类型转换 (Casting)2.1 基本数据类型的Casting2.2 对象类型转换2.3 代码演示3. 错误举例instan...
    99+
    2022-11-13
  • C语言字符串旋转问题的深入讲解
    目录字符串的旋转:实现旋转字符串:1、暴力求解法: 2、三步翻转法判断一个字符串是否由另一个字符串旋转而来1、暴力求解法:2、优化算法:关于用到的函数扩展:1、assert...
    99+
    2022-11-12
  • C语言入门篇--关键字static详解
    目录1.修饰局部变量1.1作用1.2举例(1)不加static(2)加static(3)静态局部变量的初始化只会进行一次2.修饰全局变量2.1作用2.2举例(1)不加static(2...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作