一些编译器将对 volatile 限定对象的访问视为内存栅栏。其他人没有。一些程序被编写为要求volatile用作围栏。其他人不是。
编写为需要栅栏的代码,在提供栅栏的平台上运行,可能比编写为不需要栅栏的代码运行得更好,在不提供栅栏的平台上运行,但如果不提供栅栏,需要栅栏的代码将出现故障. 不需要栅栏的代码在提供它们的平台上通常比需要栅栏的代码运行得更慢,并且提供栅栏的实现将比那些不需要栅栏的实现更慢地运行此类代码。
一个好的方法可能是将宏定义为在意味着内存栅栏的semi_volatile系统上扩展为空,或者在没有内存栅栏的系统上扩展为空。如果需要相对于其他变量而不是彼此进行访问排序的变量被限定为,并且该宏定义正确,则在有或没有内存围栏的系统上都将实现可靠的操作,并且可以是最有效的操作将在带有围栏的系统上实现。如果编译器实际上实现了一个按要求工作的限定符,则可以将其定义为使用该限定符并获得更好代码的宏。volatilevolatilevolatilesemi-volatilesemivolatile
IMHO, that's an area the Standard really should address, since the concepts involved are applicable on many platforms, and any platform where fences aren't meaningful can simply ignore them.