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

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

最佳答案

顺便说一句,volatile 的语义都取决于平台/编译器。在某些编译器(如具有 IA64 架构的 MSVC)上,volatile 关键字不仅可以防止编译器重新排序操作,还可以使用获取/释放语义执行每个读/写操作,这意味着内存屏障操作有效。另一方面,GCC 仅防止编译器在读取/写入 volatile 内存位置之前/之后重新排序操作......在具有弱内存模型的平台上,获取-释放语义不像它们那样维护MSVC。

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

关于c - 对 setjmp/longjmp 使用 volatile 的性能开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7997600/

10-15 01:11