目录

1.volatile的理解

2.volatile的作用

1.寄存器与内存

2.volatile的作用

3.总结

3.几个小问题

1.问题一

2.问题二

3.问题三


1.volatile的理解

volatile作为C语言的32个关键字的其中一个,目前我们可能从未在代码中进行使用过。是因为它没有实际应用场景吗?并不是。volatile是一个特征修饰符,它是用来修饰易变的变量,告诉编译器每次需要读取这个变量时要到内存中去读取。

2.volatile的作用

1.寄存器与内存

首先我们要清楚,我们定义的变量都是在主存中(register除外),而每当我们需要对主存中数据进行操作时,CPU都需要先进行内存访问,然后将内存中的数据读取拷贝到寄存器中,最后在寄存器中对数据进行操作。CPU对各类存储器的访问速度如下:

CPU访问速度从上到下呈递减规律;硬件存储容量从下到上呈递增规律


2.volatile的作用

我们通过下面一段代码来分析其作用:

#include<stdio.h>
int main()
{//int flag = 1;             //不加flag修饰volatile int flag = 1;   //volatile修饰while (flag){;}return 0;
}

如上,我们写了一个死循环,而循程序其他地方没有对flag进行任何修改。这时,编译器就有很大概率会对代码进行优化,将flag变量缓存至寄存器中,使得CPU不在访问主存单元,直接对寄存器中的数据进行操作,提升CPU运行的速度。

但是,如果由于某种外部因素使的flag所在内存单元被修改了呢?如多线程,中断等情况。此时由于CPU没有不会访问内存更新数据,依旧会使用在寄存器保存的旧值,导致出错,显然我们不希望看到这种情况。这时我们就可以使用volatile,volatile关键字告诉编译器这个变量可能在某些情况会发生修改,使得编译器不进行优化,CPU每次使用这个变量需要重新读取内存。


3.总结

volatile被称作易变关键字,作用是告诉编译器这个变量可能被修改,需要每次都从内存中访问这个变量,达到稳定访问内存

3.几个小问题

1.问题一

        问:既然volatile是易变关键字,而const修饰变量代表变量的内容不能被修改,那么二者能不能一起使用,会不会冲突呢?

        答:可以一起使用,const要求你不要进行修改写入即可,而volatile意思是你读取数据的时候每次都要从内存中读取,两者并不冲突,作用的地方不同。


2.问题二

        问:volatile可以用来修饰指针吗?

        答:可以。volatile修饰指针表示指针指向空间的数据是易变的,编译器每次都需要访问内存。


3.问题三

问:以下函数能否实现计算一个整数的平方的功能?

int Squa(volatile int* &ptr)       //声明为引用使外部可能更改
{int a = 0;int b = 0;a = *ptr;b = *ptr;return a*b;
}

        答:可能无法实现。volatile修饰*ptr,因此代表ptr指向空间的数据是易变的,需要访问内存。因此前后两次解引用后所得数据可能不同。正确的写法应该是:

int Squa(volatile int* &ptr)       //声明为引用使外部可能更改
{int a = 0;a = *ptr;return a*a;
}

以上,就是本期的全部内容。

制作不易,能否点个赞再走呢qwq

C语言学习之volatile相关推荐

  1. C语言学习笔记1——零散基础知识

    我的c语言学习之路是课本<c程序设计>+"面向百度编程",利用写博客的形式来监督自己去奋斗.在写这篇博文时我已经学完c语言很久了,但为了考证和出来工作的,我不得不再次巩 ...

  2. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  3. 嵌入式C语言——学习笔记

    嵌入式C语言--学习笔记 计算机程序语言的学习思路? GCC的使用及其常用选项介绍 gcc概述 C语言编译过程 C语言常见的错误 预处理的使用 宏展开下的 #.## C语言常用关键字及运算符操作 关键 ...

  4. C语言培训目标,c语言学习目标

    C C语言 c语言学习目标 (1)数据结构.算法的概念和作用 结构化程序设计的方法.三种基本结构 程序流程图和 N-S流程图 (2)C程序的一些特点.标识符和关键字的概念. 编译. 链接和运行的概念及 ...

  5. C语言学习之路--计算机系统组成以及工作原理,进制之间的转换和机器数及其表示范围

    目录 一.前言 二.计算机系统组成以及工作原理简介 1.硬件系统基本组成原理及工作原理 2.硬件各部分详解 1.运算器 2.控制器 CPU 3.存储器 1.内存储器 2.外存储器 3.拓展 4.存储器 ...

  6. C语言-学习之路-01

    C语言学习之路-01 目录 关键字 数据类型 常量 变量 声明和定义 进制 sizeof关键字 整型:int short.int.long.long long 字符型:char ASCII对照表 转义 ...

  7. C++语言学习(十二)——C++语言常见函数调用约定

    C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数 ...

  8. 微软提出CLIPBERT:通过稀疏采样的视频语言学习

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 论文是学术研究的精华和未来发展的明灯.小白决心每天为大家带来经典或 ...

  9. c语言错误的等式,C语言学习中几个常见典型错误分析.docx

    C语言学习中几个常见典型错误分析 打开文本图片集 摘要:C语言是一门优秀,应用广泛的结构化程序设计语言,是中职计算机.机电和电子技术等专业一门理论和实践相结合的课程,教学实践中,学生常觉得c语言难学, ...

最新文章

  1. R语言KMeans聚类模型示例
  2. PIE_SDK.NET功能表
  3. bootstrap19-内联表单
  4. 清华“姚班”迎来00后,高校与企业共破AI人才荒
  5. js_jQuery【下拉菜单联动dom操作】
  6. mysql + IDEA + JDBC
  7. 面向对象封装之无参无返,无参有返
  8. mos管电路_MOS管笔记之外围电路和缓冲电路设计
  9. ubuntu 的chmod 和 chown
  10. [莓技巧]黑莓7290输入短信时文字变为“?”的解决办法
  11. 笔记本电脑分屏操作指南
  12. Nr,GenBank, RefSeq, UniProt 数据库的异同
  13. 计算机毕业设计JAVA图书个性化推荐系统mybatis
  14. Windows 的数据恢复工具
  15. Win10 安装 PySC2 环境 -- DeepMind联合战网开发的《星际争霸 II》强化学习环境
  16. Roy Li的学习和成长自传
  17. Android手机下载的缓存视频如何找到?
  18. PhotoShop: PSD精准切图
  19. 30个HTML+CSS前端开发案例(二)
  20. Python数据分析的bs4用法

热门文章

  1. python元祖用法_Python中元祖的用法
  2. php将阿拉伯数字转换成中文大写,PHP将阿拉伯数字转换成汉字大写支持小数点
  3. spring boot注解@PostConstruct
  4. iPhone 6/Plus/5s/三星S5谁的屏幕更好?
  5. 阿里和云之讯短信发送服务
  6. 2011年中国高性能计算机性能TOP100排行榜
  7. 使用Cytoscape的NetworkAnalyzer工具计算网络相关属性
  8. JNPF快速开发框架的八大功能介绍
  9. linux内核漏洞查询,GitHub - F1uYu4n/linux-kernel-exploits: linux-kernel-exploits Linux平台提权漏洞集合...
  10. F014-正本清源话通缩 #F1175