volatile关键字用于告诉编译器,被修饰的变量可能会被程序以外的因素(如硬件、操作系统等)修改,因此每次访问该变量时都应该从内从中读取他的值,而不是使用可能存在的缓存之,这在多线程编程,与硬件交互以及处理中断等场景中非常重要。
const关键字用于修饰变量,使其成为常量,不能被修改。
而volatile关键字用于修饰变量,强调其值可能会被意外的改变,编译器不能对其进行优化。
使用场景不同
const 关键字:用于定义常量,如数学常数(const double PI = 3.14159;)。
作为函数参数,表示函数不会修改传入的参数,如void print(const std::string& str);。
定义常量成员函数,用于表明该函数不会修改类的成员变量。
volatile 关键字:多线程编程中共享的变量,这些变量可能会被不同的线程修改。
访问硬件寄存器,确保对寄存器的值的读取和写入是直接的,不会被编译器优化。
编译器处理方式不同
const 关键字:编译器会在编译阶段检查是否有对const变量的非法修改操作。对于const变量,编译器可以进行一些优化,比如将其值直接替换到使用它的地方,因为它的值是固定不变的。
volatile 关键字:编译器会避免对volatile变量进行可能导致错误的优化,如缓存变量的值。每次访问volatile变量时,都会从内存中读取(对于读取操作)或者写入到内存(对于写入操作),以确保程序能正确反映变量的实际变化。