我保留一个索引计数器,表示应该像圆形数组一样。我强制大小为2的幂,因此使用size_t MASK = size_ - 1
以便在遍历时替换模数:
index_ = (++index_) & MASK;
但问题是,在我的情况下,我有时会意识到我可以重用我下次在这里发布的那个索引,所以当发生这种情况时我会有这样的事情:
if (canReuseLastUsedIndex())
--index_;
但是当最后一个抛出index_
为零时,这会崩溃,因为它没有回绕到size_
(即MASK+1
)。有这种方法可以让这种情况发生吗?还是什么东西很快? (即最好不要说:if (index_) --index_; else index_ = size_
)
答案 0 :(得分:6)
您可以执行相同的操作并对其进行位掩码:
index_ = (index_ - 1) & MASK;
这是有效的,因为无符号下溢在C和C ++中定义良好。
请注意,这行代码是未定义的行为:
index_ = (++index_) & MASK;
因为你在序列点之间不断修改变量index_
(在预增量和赋值中)。
答案 1 :(得分:1)
你已经在做了。只需应用MASK
和添加相同的内容:
index_ = (index_ - 1) & MASK;