1.mutable

在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。mutable在类中只能够修饰非静态数据成员。

#include <iostream>
using namespace std;
class test
{mutable int a;int b;
public:test(int _a,int _b) :a(_a),b(_b){};void fun() const                       //fun是const 函数,不能修改类的对象的数据成员,但由于a被mutable修饰,可以修改,但不能修改b
    {a += b;}void print(){cout << a << "," << b << endl;}
};

我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。

2.volatile

volatile原意是“易变的”,但这种解释简直有点误导人,应该解释为“直接存取原始内存地址”比较合适。“易变”是相对与普通变量而言其值存在编译器(优化功能)未知的改变情况(即不是通过执行代码赋值改变其值的情况),而是因外在因素引起的,如多线程,中断等。编译器进行优化时,它有时会取一些值的时候,直接从寄存器里进行存取,而不是从内存中获取,这种优化在单线程的程序中没有问题,但到了多线程程序中,由于多个线程是并发运行的,就有可能一个线程把某个公共的变量已经改变了,这时其余线程中寄存器的值已经过时,但这个线程本身还不知道,以为没有改变,仍从寄存器里获取,就导致程序运行会出现未定义的行为。并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化。而加了volatile修饰的变量,编译器将不对其相关代码执行优化,而是生成对应代码直接存取原始内存地址。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

转载于:https://www.cnblogs.com/mrlsx/p/5556722.html

mutable和volatile关键字相关推荐

  1. C++中mutable、volatile关键字

    C++中mutable.volatile关键字 mutable和volatile 很少遇到这两个关键字,学嵌入式估计知道后者,深入研究C++的估计知道前者. (1)mutable 在C++中,muta ...

  2. mutable、volatile的使用

    本文转载自http://blog.csdn.net/tht2009/article/details/6920511 (1)mutable 在C++中,mutable是为了突破const的限制而设置的. ...

  3. amp quot memory c语言,c volatile 关键字

    C++ volatile 关键字- 简书 2017年1月1日 - 注意:本文中代码均使用Qt 开发编译环境volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改. ...

  4. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  5. volatile关键字之全面深度剖析

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

  6. c语言中volatile关键字的作用

    读文章之前 可以先看一下<程序员的自我修养 >第28页 过度优化. volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...

  7. C语言volatile关键字详解

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

  8. 爆赞,对 volatile 关键字讲解最好的一篇文章!

    欢迎关注方志朋的博客,回复"666"获面试宝典 最近,在一篇文章中了解到了 volatile 关键字,在强烈的求知欲趋使下,我查阅了一些相关资料进行了学习,并将学习笔记记录如下,希 ...

  9. Java并发编程:JMM和volatile关键字

    Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内置高速缓存区.高速缓存区的加入使得CP ...

最新文章

  1. 根据之前发的那SQL语句查询表结构的语句做了个MSSQL实体类生成器!
  2. hadoop写文件 java_写文件 - Hadoop 学习手册_教程_Java开发社区
  3. 湖南大学让晶体管小至3纳米,沟道长度仅一层原子 | Nature子刊
  4. Java中的Timer和Timer Task详解
  5. 西安网络推广教大家如何提高网站抓取量?
  6. Android RecyclerView
  7. 细思极恐!未来百万人将下岗十大职业将消失
  8. ScrollView内嵌ListView或GridView的滑动处理
  9. 并发工具类(四)两个线程进行数据交换的Exchanger
  10. 霍普分叉matlab程序,基于MATLAB_GUI的Kalman滤波程序
  11. MVVM和MVC有什么区别
  12. Java 各种日期/时间 对象转Long时间戳
  13. 2020下半年6级高频词汇整理
  14. 董路:当“边缘人”来到舞台中央
  15. 中控 人脸指纹 iface702 二次开发 (X86 X64 SDK,VB,C#Demo)
  16. 【微信小程序】上传字体文件自定义字体family
  17. 美国访问学者生活之行-公交及考驾照
  18. 看 PrisonBreak,学美语
  19. 面试,这些问题一定要问清楚!
  20. 潇潇日暮时,掠水鸳鸯散。(01背包

热门文章

  1. 299 Bulls and Cows 猜数字游戏
  2. App流量测试--使用安卓自身提供的TCP收发长度统计功能
  3. 第10月第25天 java annotation
  4. wamp的卸载、安装与配置apache配置伪静态
  5. Verilog中wire与reg类型的区别(转载自http://www.cnblogs.com/farbeyond/p/5204586.html)
  6. rdd转换成java数据结构_Spark RDD转换成其他数据结构
  7. python中文界面设定_python绘图界面中文显示
  8. mysql8.0新建用户登录_Mysql8.0 创建远程登陆账户
  9. tampermonkey怎么不能用了_iPhone12无线充电不能用怎么办-苹果12无线充电失效原因...
  10. 性能测试过程中oracle数据库报ORA-27301 ORA-27302错