volatile关键字
C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量
Volatile意思是“易变的”,“易变”是因为外在因素引起的,像多线程,中断等。,他提示在该关键字之后的变量可能随时发生改变,因此编译后的程序每次需要存储或读取这个变量的时候,告诉编译器对该变量不做优化,都会直接从变量内存地址中读取数据,从而可以提供对特殊地址的稳定访问。
如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
一个参数既可以是const还可以是volatile吗?
可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
表示一个变量在程序编译期不能被修改且不能被优化;在程序运行期,变量值可修改,但每次用到该变量的值都要从内存中读取,以防止意外错误。
const volatile int a = 10;
int main(){
// a = 100; // 非法
int* aPtr = &a;
*aPtr = 100;
cout<<a<<*aPtr<<endl;
}
一个指针可以是volatile 吗?
可以,当一个中服务子程序修改一个指向buffer的指针时。
volatile 指针
和 const 修饰词类似,const 有常量指针和指针常量的说法,volatile 也有相应的概念:
修饰由指针指向的对象、数据是 const 或 volatile 的:
const char* ptr;
volatile char* vpch;
volatile与const的区别
语义不同
const之后修饰的变量会被认为成是常量,常量是不能被修改的,保护数据的安全性
const int a=10;
volatile修饰的变量的可能随时发生变化的,直接从变量内存中读取地址
使用的场景不同
const只在编译期有用,在运行期无用
volatile在编译期和运行期都有用,在运行期:每次用到该变量的值,都从内存中取该变量的值。
const 关键字:
(1). 用于定义常量
const int a=10;
(2).作为函数参数,表示函数不会修改传入的参数
int fun(const int a){
}
(3).定义常量成员函数,用于表明该函数不会修改类的成员变量。
volatile 关键字:
(1) 并行设备的硬件寄存器(如:状态寄存器)
(2) 一个中断服务子程序中会访问到的非自动变量
(2) 多线程应用中被几个任务共享的变量