为了使 setjmp/longjmp 起作用,您需要将本地变量声明为 volatile。如果有人使用 -O3 编译代码,那么 volatile 变量对性能的影响会有多大?在 x86 多核平台上,它会很大还是只有一点点?
在我看来,这只会增加一点点开销,因为那个 volatile 变量仍然可以被缓存,从缓存中读取/写入也非常快。你们有什么看法?
在我看来,这只会增加一点点开销,因为那个 volatile 变量仍然可以被缓存,从缓存中读取/写入也非常快。你们有什么看法?
volatile
的语义都取决于平台/编译器。在一些具有IA64架构的编译器,如MSVC上,volatile
关键字不仅可以防止编译器重新排序操作,还会对每个读/写操作执行获取/释放语义,这意味着存在内存屏障操作。另一方面,GCC只能防止编译器在读/写易失性存储器位置之前/之后重新排序操作...在具有弱内存模型的平台上,无法像MSVC那样维护获取-释放语义。volatile
关键字的内存屏障的存在并不是一个问题,因此主要的惩罚将只是缺乏重排序和其他优化,这些优化可以由编译器执行。 也就是说,这将取决于您的代码外观。例如,如果您的代码中有一个紧密循环,并且某些带有volatile
限定符的变量实际上是循环不变量,则如果这些内存位置被标记为非volatile
,则您将无法获得编译器可以执行的某些优化。volatile
的巨大影响(例如声明一个比CPU缓存更大的volatile
变量数组)。volatile
的代码。这意味着包含setjmp
的函数可能会很小,很可能只包含setjmp
相关内容。在这种情况下,将几乎没有volatile
变量,它们的“影响”应该很小。
volatile
来测量性能和非性能? - Chris Lutz