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_
)
您可以执行相同的操作并对其进行位掩码:
index_ = (index_ - 1) & MASK;
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为无符号下溢在C和C++中定义良好.
请注意,这行代码是未定义的行为:
index_ = (++index_) & MASK;
Run Code Online (Sandbox Code Playgroud)
因为您index_
在序列点之间不断修改变量(在preincrement和赋值中).