然后阅读条件写入与写入

Sev*_*yev 6 cpu assembly low-level

平均而言,这更快 - 检查值,然后,如果需要,分配,或只是分配?或者,用C++术语:

bool b;
if(b)
    b = false;
Run Code Online (Sandbox Code Playgroud)

要么

b = false;
Run Code Online (Sandbox Code Playgroud)

假设if()条件为真,概率为50%.答案很可能是高度依赖于架构的 - 请说出您的低级别考虑因素.写入总是弄脏缓存行 - 对吧?因此,通过避免写入,我们在0.5个案例中避免了缓存刷新.但是足够聪明的缓存可能会检测到一个简单的写入而不是自己的脏.但无条件写入始终只是一个内存操作,而读写平均是1.5个操作.

免责声明:这是一个好奇的问题,而不是我实际面临的问题.

Ear*_*rlz 4

分支在现代 CPU 上的成本很高,而内存访问在嵌入式/较旧的 CPU 上的成本也很高。因此,平面分配总是会更快,除非你有一些奇怪的内存,写入时间比读取时间长(提示:你没有)

具体来说,由于以下原因,情况变得更糟:

  • 分支指令。处理器可以预测到这一点,但仍然可能会产生开销。
  • 2 次内存访问而不是 1 次。大多数形式的内存上的读取和写入速度相同,既然可以执行一次,为什么还要执行两次呢?
  • 更多代码开销。这是一个微型指令,但必须发出更多指令才能执行该if语句。因此意味着额外的内存读取和缓存中不必要的更多空间消耗。
  • 对于悲观的人来说,这可能意味着 C++ 编译器决定将此变量放入寄存器而不是其他更必要的变量中。
  • 另外,如果您假设b将其放入寄存器中。寄存器读/写非常便宜,但它们不是免费的。