一。volatile定义:多线程
一个定义为volatile的变量是说这变量可能会被意想不到的被改变,这样,有了volatile变量后,就提醒编译器就不会去假设这个变量的值了。精确地说就是,编译中的优化器在用到这个变量时必须每次都当心地从新读取这个变量的值,而不是使用保存在寄存器里的备份。函数
eg:优化
1.硬件设备的寄存器(如:状态寄存器).net
#define GPFCON (*(volatile unsigned long *)0x56000050)线程
2.一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)指针
3.多线程应用中被几个任务共享的变量htm
二。const定义:对象
const是一个C语言的关键字,它限定一个变量不容许被改变内存
eg:get
1.定义const常量,具备不可变性。
const int i=0; i++将报错;
2. 能够保护被修饰的东西,防止意外的修改,加强程序的健壮性。 以下面的例子,若是在函数体内修改了i,编译器就会报错;
void function(const int i) { i=10;//error! }
3. 提升了程序执行效率。
编译器一般不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操做,使得它的效率也很高。
4.能够避免意义模糊的数字出现,一样能够很方便地进行参数的调整和修改。 同宏定义同样,能够作到不变则已,一变都变!
const int i=0
若是想修改i的内容,只须要:
const int i=xxxxx;
5.便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
void function(const int i) { .........} 编译器就会知道i是一个常量,不容许修改;
三。volatile和const混用
const和volatile放在一块儿的意义在于:
(1)本程序段中不能对a做修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心;
(2)另外一个程序段则彻底有可能修改,所以编译器最好不要作太激进的优化。
“const”含义是“请作为常量使用”,而并不是“放心吧,那确定是个常量”。
“volatile”的含义是“请不要作没谱的优化,这个值可能变掉的”,而并不是“你能够修改这个值”。
所以,它们原本就不是矛盾的。
const修饰的变量不容许这里修改不表明不容许别处修改,好比:
int i = 5;
const int* p = &i;
i = 6; // 不能够;
*p = 7; // 彻底能够,并且那个“const”的“*p”也跟着变成了7。
对于非指针非引用的变量,const volatile同时修饰的意义确实不大。我的以为。
须要明白“volatile”的含义并不是是“non-const”。因此他们才能够放在一块儿。
在C++语言中,const没有反义词,若是一个变量没有const修饰,那它自己就是const的反义词,而并不是加上volatile才是const的反义词。
二者同时修饰一个对象的典型状况,是用于驱动中访问外部设备的只读寄存器。
部分引用:csdn qq306013411网友