在 SMP 机器上,#2 与 #1 相比有性能优势:
1) x = 0;
或者
2) 如果 (x) x = 0;
我在想管理 CPU 之间的缓存一致性的幕后开销可能会有一些成本。我疯了吗?
即使使用单线程代码,如果对象位于写时复制内存中(例如,文件的私有映射,或分叉后的几乎任何可写内存),后者也有优势。我怀疑您所询问的优势也是真实的,至少在 x86 等自动处理内存一致性的系统上。在此类机器上,写入可能位于另一个 cpu 缓存中的内存将使缓存副本(实际上是整个缓存行)无效。只是阅读不会有任何害处。当然,如果这是可能被多个线程修改和共享的内存,那么无论如何它都需要受到同步机制的保护,那么您可能会失去大部分或全部优势。
即使您正在阅读,它也必须管理缓存一致性,所以我认为它不会给您带来任何好处。它还将在很大程度上取决于编译器的功能。如果您真的在乎,我会在您使用的系统上对其进行基准测试。