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;