要使setjmp/longjmp工作,需要将局部变量声明为易失性变量。如果有人正在用-O3编译它的代码,那么易失性变量对性能的影响有多大。在x86多核平台上,它是巨大的还是微小的?
在我看来,它只会增加一点点开销,因为这个易失性变量仍然可以被缓存,而且从缓存中读取/写入的速度也相当快。意见?
发布于 2011-11-03 16:08:55
首先,volatile的语义依赖于平台/编译器。在一些编译器上,如具有IA64体系结构的MSVC,volatile关键字不仅可以防止编译器重新排序操作,还可以使用获取/发布语义执行每次读/写操作,这意味着实际上存在一个内存屏障操作。另一方面,GCC只阻止编译器在对易失性内存位置进行读/写之前/之后重新排序操作.在具有弱内存模型的平台上,获取发布语义并不像MSVC那样被维护。
现在在x86上,由于其严格排序的内存模型,使用volatile关键字时存在的内存屏障并不是一个问题,因此主要的惩罚将是缺少可由编译器执行的重新排序和其他优化。话虽如此,但这将取决于代码的外观。例如,如果代码中有一个紧循环,并且某些volatile-qualified变量实际上是循环不变量,那么如果这些内存位置被限定为非volatile,则不会得到编译器可以进行的一些优化。
发布于 2011-11-03 16:11:33
影响取决于局部变量的数量以及代码对它们所做的任何操作。我相信,可以为volatile的巨大影响提供一个极端的例子(例如,声明一个大于CPU缓存的volatile变量数组)。
在实践中,似乎没有人希望维护所有变量都必须是volatile的代码。这意味着包含setjmp的函数可能很小,可能只包含setjmp内容。在这种情况下,几乎没有或没有volatile变量,而且它们的“影响”确实应该很小。
https://stackoverflow.com/questions/7997600
复制相似问题