前言
本篇文章来给大家介绍volataile的意义和具体使用方法,很多同学学习了C语言可能都没有接触过这个关键字,这个关键字看起来是很少使用,但是在嵌入式开发中这个关键字还是比较重要的。
一、volataile意义
关键字 volatile 在C和C++语言中使用,它的主要作用是告诉编译器该变量是随时可能发生改变的,以避免编译器优化掉对该变量的访问或操作。
当你将一个变量声明为 volatile 时,编译器将不会对该变量进行优化,以确保每次访问或操作该变量都是从内存中读取或写入。这是因为 volatile 变量具有可能被外部因素修改的特性,例如多线程/多进程环境下的共享变量、硬件寄存器等。
以下是 volatile 关键字的几个重要意义:
1.可见性:在多线程或多进程环境中,当一个变量被声明为 volatile 时,保证了对该变量的读写都能立即生效,因此可以避免编译器对该变量的优化,确保每次读取或写入都是真实的值。
2.防止优化:编译器在进行优化时,有可能会将某些对变量的读写操作优化掉或进行重排,因为认为这些操作对程序结果没有影响。但对于 volatile 变量,编译器会忽略对其进行的优化,保证操作的执行顺序和预期一致。
3.中断处理:在嵌入式系统或操作系统内核开发中,volatile 通常用于对中断服务例程处理的变量进行声明。由于这些变量会从中断上下文中被修改,需要保证对变量的访问不受编译器的优化影响。
二、volataile和const的火花
1.const表示被修饰的变量不能出现在赋值符号左边
2.volatile表示使用变量时直接从内存中取值
3.const和volatile同时修饰变量的时候并不会互相影响
例子:
这个程序能够编译通过,所以这就印证了我们上面的说法了。
#include <stdio.h> int main() { const volatile int a = 0; int* p = &a; *p = &a; return 0; }
总结
总结起来,volatile 关键字用于标识那些可能被外部因素修改的变量,告诉编译器不要对其进行优化,以确保每次访问或操作都从内存中读取或写入变量的值。这对于多线程环境、硬件寄存器以及中断处理等场景非常有用。然而,需要注意,在多线程环境下,volatile 不能保证原子性,还需要结合其他同步机制来确保正确性。