其他分享
首页 > 其他分享> > 使用volatile for setjmp / longjmp的性能开销

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

作者:互联网

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

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

解决方法:

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

现在在x86上,由于其严格排序的内存模型,使用volatile关键字存在内存障碍不是问题,因此主要的缺点就是缺少重新排序和其他可能的优化由编译器执行.话虽如此,它将取决于您的代码是什么样的.例如,如果您的代码中存在紧密循环,并且某些volatile限定变量实际上是循环不变量,那么如果这些内存位置被限定为非变量,那么您将无法获得编译器可以执行的一些优化. -volatile.

标签:c-3,x86,linux,gcc,setjmp
来源: https://codeday.me/bug/20190729/1576114.html