如何实现永远循环运行的循环算法?
for (int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
}
上述方法的问题是integer overflow
问题。也可以通过检查i
的值来实现:
for (int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
if i == maxNumber{
i = 0;
}
}
但是这种方式很难看。也许还有更优雅的方式?
答案 0 :(得分:3)
为什么不呢?
int numberOfWorkers = 10
int roundRobinIndex = numberOfWorkers - 1
while(true){
roundRobinIndex = (roundRobinIndex + 1) % numberOfWorkers
}
或带有for循环
for (int i = 0; ;i = (i + 1) % numberOfWorkers){
roundRobinIndex = i;
}
我们现在可以摆脱i
答案 1 :(得分:3)
避免任何模调用,我们可以这样做:
constexpr int nextRR(int curIdx, int sz) {
if(curIdx==sz-1) {
return 0;
}
return curIdx+1;
}
for (int rrIndex = 0;;rrIndex = nextRR(rrIndex, sz)) {
// use rrIndex here ...
}
如果在编译时未知工作者的数量,那么这将比任何基于模块的解决方案在性能上更加有效。
请注意,nextRR
也可以这样写,以进一步优化与0的比较比与与变量的比较更快的平台:
constexpr int nextRR(int curIdx, int sz) {
if(curIdx==0) {
return sz-1;
}
return curIdx-1;
}
答案 2 :(得分:0)
出于完整性考虑(我同意pLopeGG的回答更为简洁)-如果您将i
设置为unsigned int
而不是int
,则您的方式将非常有效,因为溢出是在未签名溢出的标准,但未签名。
即
for (unsigned int i = 0; ;i++){
roundRobinIndex = i % numberOfWorkers;
}
答案 3 :(得分:-1)
为什么不将%
放入循环中?
for (int i = 0; ;++i, i %= numberOfWorkers)
{
}