volatile

  就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。(摘自 百度百科)

  volatile 影响编译器编译的结果,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错。

  

告诉compiler不能做任何优化

  

表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用。

笔试常见问题

1)一个参数既可以是const还可以是volatile吗?解释为什么。 
2); 一个指针可以是volatile 吗?解释为什么。 
3); 下面的函数有什么错误: 
int square(volatile int *ptr) 

return *ptr * *ptr; 
}

1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变,所以在使用时候需要从内存中直接读取,而它是const是因为程序不应该试图去修改它。(完全是两个概念,一个是读取并不改变,改变是由于程序有可能对它造成改变,而const是为了不允许程序去改变它。) 
2); 是的。尽管这并不很常见。一个例子是当一个中断服务子程序修该一个指向一个buffer的指针时。 
3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: 
int square(volatile int *ptr) 

int a,b; 
a = *ptr; 
b = *ptr; 
return a * b; 

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下: 
long square(volatile int *ptr) 

int a; 
a = *ptr; 
return a * a; 
}

参考

http://www.cnblogs.com/chio/archive/2007/11/24/970632.html


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

杂记 C中的volatile相关推荐

  1. C++中关键字volatile和mutable用法

    C/C++中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改.使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁 ...

  2. 面试:说说Java中的 volatile 关键词?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Matrix海子 来源 | https://w ...

  3. 如何理解 JAVA 中的 volatile 关键字

    如何理解 JAVA 中的 volatile 关键字 最近在重新梳理多线程,同步相关的知识点.关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂. ...

  4. java中的Volatile关键字使用

    文章目录 什么时候使用volatile Happens-Before java中的Volatile关键字使用 在本文中,我们会介绍java中的一个关键字volatile. volatile的中文意思是 ...

  5. Java中的Volatile如何工作? Java中的volatile关键字示例

    如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...

  6. java中二进制怎么说_面试:说说Java中的 volatile 关键词?

    volatile 这个关键字可能很多朋友都听说过,或许也都用过.在 Java 5 之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 Java 5之后,volatile 关 ...

  7. java 中violate_Java中的volatile关键字及Cache更新

    Volatile [ˈvɑːlətl],中文解释:反复无常的,易变的,不稳定的. volatile的本意是告诉编译器,此变量的值是易变的,每次读写该变量的值时务必从该变量的内存地址中读取或写入,不能为 ...

  8. java中的Volatile 变量

    Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并 ...

  9. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

最新文章

  1. centos下安装apache + subversion(转)
  2. gcc中extra qualification错误
  3. 浅谈DevExpress六:为chart创建动态数据源
  4. 一次犹豫不决策略选择
  5. 微服务(Microservices)【翻译】
  6. 固定资产拆分比例怎么计算_持有的基金要被份额拆分?对收益有影响吗?
  7. JavaScript实现动态规划方法计算特定位置的斐波那契数fibonacciNth算法(附完整源码)
  8. 有哪些经济学理论可以用在谈恋爱上?
  9. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用
  10. javascript 库_您应该在2020年尝试的10个很棒JavaScript库
  11. 数据写入mysql的方式,FMDB写入大量数据的处理方法
  12. Vijos P1975 扫雷游戏【谜题】
  13. ISO IEC 27001 企业信息安全管理要求
  14. 项目SOW工作说明书模板
  15. 网站访问统计分析工具之罗列比较
  16. 知识分享 | 卡方分析的入门小知识
  17. 腾讯云轻量应用服务器怎么用?配置搭建网站教程
  18. 7.13 编程序,比较字符串大小。
  19. 找出最长的有效括号内子括号的长度
  20. wand(wead and)算法简介与改造,修改为店铺与品牌的关键字搜索

热门文章

  1. 安装redisclient、redis-cluster,使用redis desktop manager和java(eclipse)连接redis过程遇到问题汇总
  2. QT5_数据类型转化
  3. 大数据学习——免密登录配置
  4. spring事务介绍 1
  5. 关于完全删除电脑上多余的tomcat服务器的解决办法
  6. 作业要求 20171130 每周例行报告
  7. 第三章 深入分析Java Web中的中文编码问题
  8. 第二百四十八天 how can I 坚持
  9. 一淘网挑战百度意在造势 人才储备成最大障碍
  10. excel自动保存_萌新必看!python处理excel实例