问题描述
- C语言问题,不明白结果
- template
class C
{
public:
mutable T a;
};const volatile C c{};
解决方案
这不是C语言,而是C++,C语言哪里来的模板
被mutable修饰的变量将永远处于可变的状态即使在一个const函数中。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
解决方案二:
volatile主要是防止在多处理器环境下,变量脏读。
解决方案三:
同一楼,这不是C,是C++
楼主问的不清楚,不知道下面的解答能不能帮助到你
volatile
限定词volatile告诉编译器,该变量除了可被程序改变意外还可以被其他代理改变。典型的它用于硬件地址和其他并行运行的程序共享的数据。例如,一个地址中可能保存着当前的时钟信息。不管程序做些什么,该地址会随时间改变。另一种情况是一个地址用来接收来自其他计算机的信息;
语法同const:
volatile int a;//a是一个易变的位置
volatile int * pf;//pf指向一个易变的位置
把volatile作为一个关键字的原因是它可以方便编译器优化。
假如有如下代码:
va= x;
//一些不使用x的代码
vb= x;
一个聪明的编译器可能注意到你两次使用了x,但是没有改变它的值,它将把x临时存贮在一个寄存器中,接着,当vb主要x是的时候,它从寄存器而非初始的内存位置得到x的值来节省时间。这个过程被称为缓存。通常缓存是一个好的优化方式,但是如果两个语句中间的其他代理改变了x的值的话就不是这样了。如果没有规定volatile关键字,编译器将无从得知这种改变是否可能发生,因此,为了安全起见,编译器不使用缓存。那是在ANSI以前的情形,现在,如果在声明中没有使用volatile关键字,编译器就可以假定一个值在使用过程中没有修改,它就可以试着优化代码。总而言之,volatile使得每次读取数据都是直接在内存读取而不是缓存。
你可能会觉得奇怪,const和volatile可以同时使用,但是确实可以。例如硬件时钟一般不能由程序改变,这使得他成为const,但他被程序以外的代理改变,这使得他成为volatile,所以你可以同时使用它们,顺序是不重要的:
const volatile time;
volatile表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类 型如:intcharlong......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员 都会被视为volatile.
该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
解决方案四:
一楼的解释很清晰了,volatile关键字一般不会用到,但在嵌入式开发中是时常用到的,它的作用是标记变量,每次使用时都是重新从内存中取出,如果使用的变量是一个寄存器变量,就会出错。。。
解决方案五:
volatile 是为了防止冲突的
解决方案六:
如果是那个volatile 不太明白的话,你的疑惑应该就是,为什么const了,还要用volatile 这个关键字
其实即使一个变量定义了const,但并不意味着它一定不会改变
多见一些嵌入式的,信号、设备的标志位修改
个人见解