yyds干货盘点#【C/C++面试必备】volatile 关键字 - 51CTO博客

文章推薦指數: 80 %
投票人數:10人

yyds干货盘点#【C/C++面试必备】volatile 关键字,本文来讲解一下C/C++中的关键字volatile。

在日常的使用中很少使用到,但是,在面试中经常被提起, ... #yyds干货盘点#【C/C++面试必备】volatile关键字 关注 Linux猿 赞 收藏 评论 分享 微博 QQ 微信 #yyds干货盘点#【C/C++面试必备】volatile关键字 原创 Linux猿 2021-11-1619:47:18 ©著作权 文章标签 linux 编译器 #include 寄存器 #yyds干货盘点# 文章分类 C/C++ 编程语言 yyds干货盘点 ©著作权归作者所有:来自51CTO博客作者Linux猿的原创作品,如需转载,请与作者联系,否则将追究法律责任#yyds干货盘点#【C/C++面试必备】volatile关键字https://blog.51cto.com/u_13685039/4605844 本文来讲解一下C/C++中的关键字volatile。

在日常的使用中很少使用到,但是,在面试中经常被提起,下面具体来看一下。

volatile的作用是什么呢?volatile意思是易变的,是一种类型修饰符,在C/C++中用来阻止编译器因误认某段代码无法被代码本身所改变,而造成的过度优化。

编译器每次读取volatile定义的变量时,都从内存地址处重新取值。

这里就有点疑问了,难道编译器取变量的值不是从内存处取吗?并不全是,编译器有时候会从寄存器处取变量的值,而不是每次都从内存中取。

因为编译器认为变量并没有变化,所以认为寄存器里的值是最新的,另外,通常来说,访问寄存器比访问内存要快很多,编译器通常为了效率,可能会读取寄存器中的变量。

但是,变量在内存中的值可能会被其它元素修改,比如:硬件或其它线程等。

来看一个实际的例子:#includeintmain(){constintvalue=10;int*ptr=(int*)&value;printf("初始值:%d\n",value);*ptr=100;printf("修改后的值:%d\n",value);return0;}编译程序,执行命令:​linuxy@linuxy:~/volatile$gccmain.c-omain运行后输出:​linuxy@linuxy:~/volatile$gccmain.c-omainlinuxy@linuxy:~/volatile$./main初始值:10修改后的值:100linuxy@linuxy:~/volatile$可以看到value的值变化了。

接下来再看一下编译时添加-O参数优化的情况,执行命令 gcc-Omain.c-omain。

输出结果为:linuxy@linuxy:~/volatile$gcc-Omain.c-omainlinuxy@linuxy:~/volatile$./main初始值:10修改后的值:10linuxy@linuxy:~/volatile$-O参数:​使用该参数,编译器会尝试减少代码大小和执行时间,但不执行需要占用大量编译时间的优化。

优化编译需要占用更多的时间,对于大型函数需要占用更大的内存。

来看一下上面例子优化前和优化后代码大小的对比:​linuxy@linuxy:~/volatile$gccmain.c-omainlinuxy@linuxy:~/volatile$ls-almain-rwxrwxr-x1linuxylinuxy167527月1814:38mainlinuxy@linuxy:~/volatile$gcc-Omain.c-omainlinuxy@linuxy:~/volatile$ls-almain-rwxrwxr-x1linuxylinuxy167047月1814:38mainlinuxy@linuxy:~/volatile$可以看到,优化后文件变小了。

那再看一下给上面的代码添加上volatile关键字后会怎样?#includeintmain(){volatileconstintvalue=10;int*ptr=(int*)&value;printf("初始值:%d\n",value);*ptr=100;printf("修改后的值:%d\n",value);return0;}执行命令编译程序:​linuxy@linuxy:~/volatile$gcc-Omain.c-omain​输出为: ​​linuxy@linuxy:~/volatile$gcc-Omain.c-omainlinuxy@linuxy:~/volatile$./main初始值:10修改后的值:100linuxy@linuxy:~/volatile$可以看到,即使添加了-O参数优化程序,value的值依然被改变了。

 最后,看一下volatile是怎样使用的。

1.修饰普通变量​volatile类型变量类型volatile变量volatile放置到类型前后都可以。

例如:​#includeintmain(){volatileinta=10;intvolatileb=20;printf("a=%d\nb=%d\n",a,b);}编译后输出:​linuxy@linuxy:~/volatile$gcc-omainmain.clinuxy@linuxy:~/volatile$./maina=10b=20linuxy@linuxy:~/volatile$​2.修饰指针修饰指针和const类似(volatile和const都是类型修饰符),有三种形式:volatileint*p;int*volatilep;volatile类型*volatile变量;看一下具体的代码: ​#includeintmain(){inta=10;volatileint*p=&a;int*volatileq=&a;volatileint*volatilex=&a;printf("*p=%d\n*q=%d\n*x=%d\n",*p,*q,*x);}编译后输出为:​linuxy@linuxy:~/volatile$gcc-omainmain.clinuxy@linuxy:~/volatile$./main*p=10*q=10*x=10linuxy@linuxy:~/volatile$3.作为函数参数作为函数参数需要注意,例如:intsquare(volatileint*ptr){return*ptr**ptr;}编译器处理的逻辑类似于以下情况:​intsquare(volatileint*ptr){inta,b;a=*ptr;b=*ptr;returna*b;}​​因为ptr被声明为volatile,所以a和b的值可能是不一样的,所以最好采用如下这种方式:​longsquare(volatileint*ptr){inta;a=*ptr;returna*a;}​ 赞 收藏 评论 分享 微博 QQ 微信 举报 上一篇:#yyds干货盘点#【C/C++面试必备】声明和定义的区别 下一篇:#yyds干货盘点#struct和class的区别 举报文章 请选择举报类型 内容侵权 涉嫌营销 内容抄袭 违法信息 其他 具体原因 包含不真实信息 涉及个人隐私 原文链接(必填) 补充说明 0/200 上传截图 格式支持JPEG/PNG/JPG,图片不超过1.9M 取消 确认 已经收到您得举报信息,我们会尽快审核 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 (0) 最热 最新 相关文章 Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都 java 多线程 缓存 主存 重排序 【Flutter专题】98易忽略的【小而巧】的技术点汇总(六)#yyds干货盘点# 0基础学习Flutter,继续整理日常使用的小知识点! Flutter专题 Flutter小菜 Android小菜鸟 0基础学习Flutter #yyds干货盘点# yyds干货盘点#关键字:volatile详解 关键字:volatile详解volatile的作用详解防重排序我们从一个最经典的例子来分析重排序问题。

大家应该都很熟悉单例模式的实现,而在并发环境下的单例实现方式,我们通常可以采用双重检查加锁(DCL)的方式来实现。

其源码... 重排序 内存屏障 编译器 #yyds干货盘点# 【嵌入式】C语言中volatile关键字 00.目录文章目录00.目录01.volatile概述02.volatile应用场景03.volatile应用示例04.嵌入式系 C C语言 volatile volatile关键字 C语言volatile 面试突击51:为什么单例一定要加volatile? 单例模式的实现方法有很多种,如饿汉模式、懒汉模式、静态内部类和枚举等,当面试官问到“为什么单例模式一定要加volatile?时,那么他指的是为什么懒汉模式中的私有变量要加volatile?懒汉模式指的是对象的创建是... 重排序 内存可见性 线程安全 volatile作用 volatile使用场景:线程间共享变量需要使用volatile关键字标记,确保线程能够读取到更新后的最新变量值。

volatile关键字的目的是告诉虚拟机:1.每次访问变量时,总是获取主内存的最新值。

2.每次修改变量后,立刻会... volatile作用 共享变量 流程图 使用场景 JNI简单示例 JNI即JavaNativeInterface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库 java 头文件 c++ yyds干货盘点#C++static 作者:Linux猿简介:CSDN博客专家?...数据结构和算法、C/C++、面试、刷题、Linux尽管咨询我,关注我,有问题私聊!关注专栏:动图讲解数据结构和算法(优质好文持续更新中……)?欢迎小伙伴们点赞?收藏⭐、留言? 静态数据成员 静态成员函数 静态成员 #yyds干货盘点# #yyds干货盘点# 数据结构-哈希表 一名在校学生,本片主要讲解一种数据结构:哈希表本节重点内容一、前言二、数组三、哈希表1、百度百科2、问题引用3、哈希函数4、哈希表结构5、举例分析6、哈希冲突7、哈希表的优缺点四、面试题1.1.只出现一次的数字2... 数组 数据结构 数据 #yyds干货盘点# C++单例模式总结与剖析 C++单例模式总结与剖析单例可能是最常用的简单的一种设计模式,实现方法多样,根据不同的需求有不同的写法;同时单例也有其局限 线程安全 c++ #include yyds干货盘点#一文搞懂NULL和nullptr的区别【C/C++面试必备】 大家可能对NULL和nullptr都有了解,NULL属于C语言中的宏,后来C++11引入了nullptr关键字,都用来表示空指针。

那问题来了,为什么C++11要引入nullptr呢?那必定是NULL在某些方面存在某些不足,所以... linux c++ #define c++11 #yyds干货盘点# #yyds干货盘点# yyds干货盘点#【C/C++面试必备】bfs和dfs的区别 作者:Linux猿简介:CSDN博客专家?C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 结点 数据结构 搜索 深度优先搜索 #yyds干货盘点# #yyds干货盘点# Lua Lua特性轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。

可扩展:Lua提供了非常易于使用的扩展接口和机制 lua 多线程 c语言 Java基础知识面试题(2022最新版) Java基础知识面试题(2020最新版)#Java和C++的区别都是面向对象的语言,都支持封装、继承和多态Java不提供指针来直接访问内存,程序内存更加安全Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承... 父类 子类 java yyds干货盘点#【React工作记录六十三】Http常见错误 前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易... 服务器 数据 常见错误 #yyds干货盘点# yyds干货盘点#【C/C++面试必备】声明和定义的区别 本文来介绍一下声明和定义的区别,本文中的程序以C/C++为例进行说明。

一、变量的声明和定义1.1 声明声明是用来告诉编译器变量的名称和类型,而不分配内存。

例如:externintvar;声明externintble=10;定义... 编译器 函数定义 函数声明 c++ #yyds干货盘点# #yyds干货盘点# yyds干货盘点#关键字:synchronized详解 关键字:synchronized详解Synchronized的使用在应用Sychronized关键字时需要把握如下注意点:一把锁只能同时被一个线程获取,没有获得锁的线程只能等待;每个实例都对应有自己的一把锁(this),不同实例之间互不影响;... ide 代码块 同步代码块 #yyds干货盘点# yyds干货盘点#Java并发基础-volatile 在前面的文章中,我们介绍了synchronized关键字的使用和部分原理,下面我们再来看看在并发编程中另一个非常重要的关键字volatile。

为了直观的体会volatile的作用,下面先看一段代码:javapublicclassVolatileTest{... 加锁 并发 多线程 #yyds干货盘点# yyds干货盘点#解决剑指offer:剪绳子(进阶版) 1.简述:描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>...例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

由于答案过大 最大乘积 取模 数据 Linux猿 关注 私信 近期文章 1.#yyds干货盘点#求约数 2.#yyds干货盘点#动态规划求矩形面积 3.#yyds干货盘点#枚举应用 4.#yyds干货盘点#最优配对算法 5.#yyds干货盘点#最长单调递增子序列应用 热门文章 #yyds干货盘点#KMP算法应用 #yyds干货盘点#枚举应用 #yyds干货盘点#并查集按个数合并应用 #yyds干货盘点#最长单调递增子序列应用 #yyds干货盘点#最优配对算法 七日热门 【C/C++】C/C++博客汇总 【C/C++】C/C++博客汇总 C++c++初识 c/c++ c/c++ C/C++ c/c++ candc++ C/C++ c/c++ 相关标签 全部 cvolatile关键字的作用 c++语言中的关键字 c语言中volatile关键字的作用 c语言关键字volatile javavolatile关键字 javavolatile关键字的作用 java中volatile关键字 java中volatile关键字详解 java关键字+面试 java关键字volatile 签到领勋章 返回顶部 51CTO博客 首页 关注 热榜 订阅专栏 学堂 精培 开源社区 CTO训练营 51CTO 班级博客 登录注册 手机随时阅读 新人专享大礼包¥24 写文章 搜索历史 清空 热门搜索 查看【 】的结果 Copyright©2005-202251CTO.COM 版权所有京ICP证060544号 关于我们 官方博客 意见反馈 了解我们 全部文章 在线客服 网站地图 热门标签 友情链接 开源基础软件社区 51CTO学堂 51CTO



請為這篇文章評分?