Skip to content

Latest commit

 

History

History
25 lines (13 loc) · 1.96 KB

volatile和asm.md

File metadata and controls

25 lines (13 loc) · 1.96 KB

volatile关键字声明的变量,其最重要的作用是:告诉编译器,某些不被编译器可知的因素也可以修改该变量的值,包括操作系统、硬件、多线程等,

所以使用这个变量的代码部分不能做编译优化,从而让编译器每次需要读取该变量的值时必须从该变量的地址(内存)中读,这样就会保证不会出错。

如果存在编译优化的话,变量值可能被某些不被编译器可知的因素偷偷修改,但是编译器从就近读过的值(优化方式)直接读取,会出错,volatile能保证代码一定不被优化,每次都从地址读取,就保证了不会出错!

更详细的解释

GCC允许C/C++中嵌入汇编语言,以解决C/C++无法处理的问题或者使用更简介的汇编来表达

这就叫GCC内联汇编, GCC Inline ASM

__asm__ 是汇编asm的宏定义, 是一切内联汇编的开头

__volatile__ 是c++关键字volatile的宏定义, __asm__ __volatile__("指令列表")表达不要优化写的汇编指令

__asm__("":::"memory")声明此处内存可能发生了编译器察觉不到的变化,让编译器不再使用优化,老老实实从内存读取并生成不优化的汇编指令

它告诉编译器:这条指令(其实是空的)可能会读取任何内存地址,也可能会改写任何内存地址。那么编译器会变得保守起来,它会防止这条fence命令上方的内存访问操作移到下方,同时防止下方的操作移到上面,也就是防止了乱序,是我们想要的结果。 但这还没完,这条命令还有另外一个副作用:它会让编译器把所有缓存在寄存器中的内存变量flush到内存中,然后重新从内存中读取这些值。

更详细的华为的帖子 知乎文章