使用volatile for setjmp/longjmp的性能开销

Met*_*est 3 c linux x86 gcc setjmp

要使setjmp/longjmp起作用,您需要将局部变量声明为volatile.如果有人用-O3编译其代码,那么volatile变量对性能的影响是多少.在x86多核平台上它会是巨大的还是只有一点点?

在我看来,它只会增加一点点开销,因为挥发性变量仍然可以缓存,无论如何从缓存读取/写入都非常快.意见?

Jas*_*son 5

简而言之,volatile所有语义都依赖于平台/编译器.在某些编译器(如具有IA64体系结构的MSVC)上,volatile关键字不仅可以防止编译器重新排序操作,还可以使用获取/释放语义执行每个读/写操作,这意味着存在有效的内存屏障操作.另一方面,GCC仅阻止编译器在读取/写入易失性存储器位置之前/之后重新排序操作...在具有弱存储器模型的平台上,获取释放语义不像它们那样维护MSVC.

现在在x86上,因为其严格排序的内存模型,从使用的内存屏障存在volatile的关键字不是问题,所以主要的罚款仅仅是缺乏重新排序和其它优化可以执行由编译器.话虽如此,它将取决于您的代码是什么样的.举例来说,如果你在你的代码,和某些紧密环volatile-qualified变量实际上是循环不变,你不会得到一些优化,如果这些内存位置被认定为不可编译器可以做volatile.