要使setjmp/longjmp工作,您需要将局部变量声明为 volatile。如果有人使用 -O3 编译其代码,那么 volatile 变量对性能的影响有多大。在 x86 多核平台上它会很大还是只有一点点?
在我看来,它只会增加一点点开销,因为该 volatile 变量仍然可以被缓存,并且从缓存中读取/写入无论如何都非常快。意见?
顺便说一句,所有的语义volatile
都取决于平台/编译器。在某些编译器(如具有 IA64 架构的 MSVC)上,该volatile
关键字不仅可以防止编译器重新排序操作,还可以使用获取/释放语义执行每个读/写操作,这意味着存在内存屏障操作。另一方面,GCC 仅阻止编译器在读/写易失性内存位置之前/之后重新排序操作......在具有弱内存模型的平台上,获取释放语义不像它们那样维护MSVC。
现在在 x86 上,由于其严格排序的内存模型,使用volatile
关键字造成的内存屏障的存在不是问题,因此主要的惩罚将仅仅是缺乏可以执行的重新排序和其他优化由编译器。话虽如此,这将取决于您的代码的外观。例如,如果您的代码中有一个紧密循环,并且某些volatile
-qualified 变量实际上是循环不变量,那么如果这些内存位置被限定为非volatile
.
影响取决于局部变量的数量以及代码对它们所做的任何事情。我敢肯定,一个极端的例子可以产生巨大的影响(例如,声明一个大于 CPU 缓存volatile
的变量数组)。volatile
在实践中似乎没有人愿意维护所有变量都必须是volatile
. 这意味着包含的函数setjmp
可能会很小,可能只包含这些setjmp
东西。在这种情况下,变量将很少或没有volatile
,它们的“影响”确实应该很小。