0

我正在为应该表现得像一个圆形数组的东西保留一个索引计数器。我强制大小为 2 的幂,因此size_t MASK = size_ - 1在像这样遍历时用于替换模数:

index_ = (++index_) & MASK;

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

if (canReuseLastUsedIndex())
    --index_;

但是当最后一次抛出index_为零时,这会崩溃,因为这不会环绕到size_(即MASK+1)。有没有办法让这种情况发生?或者非常快的东西?(即最好不必说if (index_) --index_; else index_ = size_:)

4

2 回答 2

6

您可以做同样的事情并对其进行位掩码:

index_ = (index_ - 1) & MASK;

这是因为无符号下溢在 C 和 C++ 中定义良好。

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

index_ = (++index_) & MASK;

因为您index_在序列点之间多次修改变量(在预增量和赋值中)。

于 2012-11-09T19:10:26.700 回答
1

你已经在做。只需应用MASK与添加相同的方法:

index_ = (index_ - 1) & MASK;
于 2012-11-09T19:10:40.163 回答