C/C++ 中volatile 关键字

发布于:2024-11-29 ⋅ 阅读:(23) ⋅ 点赞:(0)

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) 多线程应用中被几个任务共享的变量