C语言的关键字,volatile,表示易变的数据,这个变量前面加上volatile是一个安全保障措施,加上这个关键字的目的就是防止编译器优化.编译器优化如果设置为最低的时候,这个关键字没有用,如果提高优化等级,这个关键字是有用的.编译器优化是去除冗余代码,但是去除无用的繁杂代码,降低代码空间,提升运行效率,但是有时候编译器的优化会弄巧成拙.对变量加上volatile就是告诉编译器,无论干什么都原封不动的去执行,避免优化掉了.
编译器会利用缓存来加速代码,比如要频繁的读取内存的某个变量,最常见的优化方法是先把变量转移到高速缓存里来,在STM32内核里,有个类似缓存的工作组寄存器,这些寄存器的访问速度最快,可以先把变量放到缓存里,需要读写的时候,直接访问缓存就行了,用完之后,再写回内存,这是一个优化方案.但是,如果程序中有多个线程,比如中断函数,在中断函数中,改变了这个原始变量,那可能缓存不知道更改了,下个程序还看缓存的变量,就会造成数据更改不同步的问题,这时采用在读取变量定义的前面加上一个volatile,告诉编译器这个变量是易变的,每次读取都要执行到位,要直接从内存中找,不要再用缓存优化了.
总结:如果开启了编译器优化,在无意义加减变量,多线程更改变量,读写与硬件相关的存储器时,都需要加上volatile防止被编译器优化,如果默认不开启编译器优化的话,是否加volatile都一样.
C语言关键字volatile的作用
于 2024-01-19 17:44:24 首次发布