我该怎么做 - 两个快速的mod功率就像一个快速的++功率?

Pal*_*han 0 c++ optimization performance bit-manipulation bitwise-operators

我保持一个索引计数器,应该像圆形数组一样.我强制大小为2的幂,因此用于size_t MASK = size_ - 1在遍历时替换模数:

index_ = (++index_) & MASK;
Run Code Online (Sandbox Code Playgroud)

但问题是,在我的情况下,我有时会意识到我可以重用我下次在这里发布的那个索引,所以当发生这种情况时我会有这样的事情:

if (canReuseLastUsedIndex())
    --index_;
Run Code Online (Sandbox Code Playgroud)

但是当最后一次抛出index_是零时,这会崩溃,因为这不会缠绕到size_(即MASK+1).有这种方法可以让这种情况发生吗?还是什么东西很快?(即,优选不具有地说:if (index_) --index_; else index_ = size_)

Ada*_*eld 6

您可以执行相同的操作并对其进行位掩码:

index_ = (index_ - 1) & MASK;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为无符号下溢在C和C++中定义良好.

请注意,这行代码是未定义的行为:

index_ = (++index_) & MASK;
Run Code Online (Sandbox Code Playgroud)

因为您index_在序列点之间不断修改变量(在preincrement和赋值中).

  • @PalaceChan`index =(index + 1)&MASK;` (2认同)