• 假设只需要将一个值绑定(bind)到某个
    bState为true时某个对象的数据成员。当bState
    是错误的,这不是必需的,但也没有阻碍。

  • 以下哪段代码会更高效,为什么?

    (编辑:已更新,状态现在是该对象的成员)
    const int x;
    int i;
    int iToBind;
    Classname pObject[x];
    
    for (; i < x; ++i) {
     if (pObject[i].bState) {
            pObject[i].somedatamember = iToBind;
        }
    }
    

    与:
    for (; i < x; ++i) {
       pObject[i].somedatamember = iToBind;
    }
    

    最佳答案

    我想说后者肯定更快。第一个版本具有双向内存访问权限,后者具有单向内存访问权限。

    在此版本中:

    for (; i < x; ++i) {
      if (pObject[x].bState) {
        pObject[x].somedatamember = iToBind;
      }
    }
    
    if语句期间出现停顿,因为CPU必须等待从内存中读取数据。读取内存的速度取决于数据所在的位置。离CPU越远,花费的时间越长:L1(最快),L2,L3,Ram,磁盘(最慢)。

    在此版本中:
    for (; i < x; ++i) {
      pObject[x].somedatamember = iToBind;
    }
    

    只有写入内存。写入内存不会使CPU停顿。

    与内存访问时间一样,后一个循环在循环内部没有条件跳转。条件循环是相当大的开销,尤其是在采取/未采取决策实际上是随机的情况下。

    08-26 15:09