文档章节

const;volatile

pp__qq
 pp__qq
发布于 2015/02/24 21:47
字数 853
阅读 41
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

注:

  • 由于从没有使用过 volatile 这个关键词,所以以下内容中,关于 volatile 的说明可能不是正确的.

const;volatile

  • 在编译期看来,const,volatile 是变量的属性,如下:

const volatile int i = 33;
// 编译期会将 i 当作一个变量,其中"int"表明了该变量的类型,"33"则指定了变量的初始值;
// 而 "const","volatile" 则认为是变量 i 的属性,其中
// const 表明变量 i 的值不可以被修改
// volatile 告诉编译期每一次读取 i 的值时都从内存中读取,而不是从缓存中(如寄存器).

volatile

  • 用来修饰一个变量,告诉编译期

    • 每一次对该变量的读取都是从内存中,而不是从缓存中(如:寄存器).
    • 每一次修改变量的值时,都将新值写入到内存中,而并不是只写到缓存中.
int i = 10;
int a = i;
sleep(3);
int b = i;

// 则编译期翻译的汇编代码可能是:
mov eax,i  ;
mov a,eax  ; 将 i 赋值给 a.
call sleep ; 在此之前可能需要插入参数.
mov b,eax  ; 将 i 赋值给 b.此时直接从寄存器中读取数据,减少了内存访问次数.

// 当使用了 volatile 关键词后,即:volatile int i = 33;编译期翻译的代码可能如下:
mov eax,i  ;
mov a,eax  ; 
call sleep ; 
mov eax,i  ; 始终从内存中访问 i 的值.
mov b,eax  ;

// 第 2 个程序,演示修改变量的值后,将新值写入到内存的必要性.
int i = 0;
void thread_func(){
    lock(); // 获取 i 的保护锁.
    i = i+1;
    unlock();
}
// 则此时编译器编译结果可能是:
call lock();
mov eax,i;
inc eax
// mov i,eax;//编译器为了提高效率而可能不会立即将新值写入到内存中,所以可能没有该指令.
call unlock();
// 这样若 2 个线程都同时执行 thread_func(),在线程 1 获取锁,并修改 i 的值,然后释放锁;此时线程2看到的 i 将仍然是 0.

const,volatile 与指针

  • int const *iptr = &i;int *const iptrc = &i;这两个语句的区别,首先要知道 iptr,iptrc 也是一个变量,其类型为 int* 类型,表明该变量的值是一个地址,指向着一个 int 类型的变量.

    • int const *iptr; const 的作用范围是 *iptr,即此处 const 并不是表明 iptr 的值不可以修改,而是 iptr 指向的 int 类型变量(即 i 的值)不可以修改.

    • int * const iptrc; const 的作用范围是 iptrc,表明变量 iptrc 的值不可以修改,但是 iptrc 指向的 int 类型变量是可以修改的,如下:

int i = 33;
int const *iptr = &i;
int * const iptrc = &i;
++(*iptr); // 错误,increment of read-only location ‘* iptr’
++iptr;    // 正确;
++(*iptrc);// 正确
++iptrc;   // 错误,increment of read-only variable ‘iptrc’

  • volatile,const 的修饰范围为从 const,volatile 所在的位置到变量名处.如下:

int const ci = 33; // const 作用范围是 ci;表明变量 ci 的值是不可以修改的.
int const *ciptr = &ci; // const 的作用范围是"*ciptr",表明 ciptr 指向的 int 类型变量的值是不可以修改的.
int const * const ciptrc = &ci; 
// 第 1 个 const 的修饰范围是 *ciptrc,表明 ciptrc 指向的 int 类型变量的值是不可以修改的.
// 第 2 个 const 的修饰范围是 ciptrc,表明变量 ciptrc 的值是不可以修改的.
int const ** ciptrptr = &ciptr;
// const 的修饰范围是 **ciptrptr,
int const * const *ciptrcptr = &ciptrc;



© 著作权归作者所有

上一篇: 类型转换
下一篇: algorithm
pp__qq
粉丝 18
博文 66
码字总数 97223
作品 0
合肥
程序员
私信 提问
加载中
请先登录后再评论。
C++——volatile关键字的学习

首先声明一点,本文是关于volatile关键字的学习,学习内容主要是来自一些大牛的网络博客。 一篇是何登成先生的C/C++ Volatile关键词深度剖析(http://hedengcheng.com/?p=725) 一篇是chaoy...

osc_eviv4ku7
2019/03/13
2
0
C++ 惯用法: const 常量和字面量

原文:C++ 惯用法: const 常量和字面量 作者:Breaker C++ 中 const 关键字、常量和字面量的惯用法 关键字:const, enum, const_cast, const_iterator, mutable, 左值, 字面量 本质和非本质上...

晨曦之光
2012/05/23
596
0
C语言-const和volatile深度分析

1、const只读变量   const修饰的变量是只读的。本质还是变量   const修饰的局部变量在栈上分配空间   const修饰的全局变量在全局数据区分配空间   const只在编译期有用,在运行期无用...

osc_gssohi23
2018/12/15
2
0
C语言 —— const和volatile同时修饰某对象的意义

const和volatile同时修饰某对象的意义: volatile const int i; (1)本程序段中不能对 i 做修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心; (2)另一个程序段则...

follitude
2016/05/13
194
0
const、volatile、mutable的用法

const、volatile、mutable的用法 const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是:const修饰的类型...

小熊猫大暴走
2012/04/24
103
0

没有更多内容

加载失败,请刷新页面

加载更多

使用Hadoop分析气象数据完整版(附带完整代码)

《分布式》布置了一道小作业,让我花了7天时间学习了Hadoop。。。现在终于可以正式地做这个作业了,记录一下。 使用Hadoop分析气象数据 1 获取数据 1.1 下载数据 1.2 数据格式 1.3 合并数据 ...

osc_igulbmxy
14分钟前
14
0
kubeadm安装部署kubernetes

使用kubeadm安装部署kubernetes集群 难点:kubeadm部署kubernetes集群 是把kubernetes的各个组件(kube-apiserver kube-controller-manager kube-scheduler kube-proxy etcd coredns)作为容器......

鸿FW
14分钟前
17
0
完整安装配置MAVEN环境

标题安装配置MAVEN环境 1. 下载MAVEN 网址:https://maven.apache.org/download.cgi 2. 配置环境变量 配置环境变量钱前你要安装和配置好了JAVA在继续 我下载的MAVEN 注意:文件的路径不要有...

osc_afjz4qba
15分钟前
22
0
Arcgis Online - Renderer篇

Arcgis Online - Renderer篇 1.Renderer SimpleRenderer 2.Symbol 3.案例 1.Renderer Renderer是一种地图要素渲染器,有多种类型的渲染器用于可视化数据,每种方法都有不同的用途,可以结合地...

osc_l7zl78wt
17分钟前
8
0
.NET IDE Rider公布2020.2路线图

跨平台 .NET IDE Rider 近日公布了 2020.2 的路线图,介绍了目前正在开发的一些特性,并表示其中一些可能在接下来的版本中出现。主要包括: Windows 上的 .NET Core 后端:Rider 2020.1 已在...

osc_zitca8hu
18分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部