#define barrier() asm volatile("" ::: "memory")
#define barrier() asm volatile("" ::: "memory")
是在 C 和 C++中常用的一种编程技巧,它的作用是防止编译器进行过度的优化。
这行代码的意思是定义了一个名为 barrier()
的宏,它插入了一个内存屏障(memory barrier)。这个内存屏障并不能影响硬件的行为,但会影响到编译器的优化行为。
-
asm
是向 C 或 C++ 代码中插入汇编语言代码的指令。 -
volatile
是一个标志,用来告诉编译器,该代码块中的操作不应被优化或重排。也就是说,即使编译器认为这段汇编代码什么都没有做,也不应该将其优化掉。 -
""
里面没有任何汇编指令,这意味着这个asm
块本质上是一个空操作。 -
"memory"
是一种称为 "Clobber list" 的东西的一部分,用来告诉编译器这个asm
块可能会改变内存的状态。因此在asm
块之前的所有内存读写都不能被重新排序到asm
块之后,同样地,asm
块之后的所有内存读写也不能被重新排序到asm
块之前。
因此,barrier()
函数的作用主要是阻止编译器将 barrier()
前后的代码进行重排,以避免由于编译器优化导致的一些意想不到的后果。