0

我保持索引计数器应该像循环数组那样行为。我强迫大小是2的幂,因此为了使用size_t MASK = size_ - 1更换模遍历像这样的时候:我该怎么办 - 快速调整两个功率,就像一个快速调整两个++功率一样?

index_ = (++index_) & MASK; 

但问题是,在我的情况,我有时意识到我可以再使用该索引下一次我递出在这里,所以出现这种情况时,我有这样的事情:

if (canReuseLastUsedIndex()) 
    --index_; 

但随后这个崩溃当最后抛出index_是零,因为这不环绕到size_(即MASK+1 )。有没有一个bitop的方式来实现这一点?或者是非常快的东西? (即优选不必说:if (index_) --index_; else index_ = size_

+2

留下这样的微优化您优化的编译器(例如'G ++ -O3 -Wall'或'铛++ -O3')。他们会比你做得更好,或者我们能做得更好。 –

+0

你的意思是其他index_ = size_ -1; ...( - index&MASK)will just work –

+1

总是有'index_ =(index_ + MASK)& MASK;' –

回答

6

你可以做同样的事情,它的位掩码:

index_ = (index_ - 1) & MASK; 

这工作,因为无符号溢在C和C++明确。

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

index_ = (++index_) & MASK; 

因为你正在修改的变量index_比序列点之间的一次(在预增量和分配两个)。

+1

FWIW,这不是下溢。这是负面溢出。 –

+0

等待那是未定义的行为?那么做这条路线的正确方法是什么? –

+2

@PalaceChan'index =(index + 1)&MASK;' –

1

你已经在做它。简单地套用MASK你与另外做了同样的:

index_ = (index_ - 1) & MASK;