用于计算循环缓冲区中剩余空间的简化算法?

Dyn*_*ite 7 c++ circular-buffer

我想知道是否有一种更简单的(单一)方法来计算循环缓冲区中的剩余空间而不是这个?

int remaining = (end > start)
                ? end-start
                : bufferSize - start + end;
Run Code Online (Sandbox Code Playgroud)

j_r*_*ker 8

如果您担心预测条件不佳会降低CPU管道的速度,您可以使用:

int remaining = (end - start) + (-((int) (end <= start)) & bufferSize);
Run Code Online (Sandbox Code Playgroud)

但这可能是过早的优化(除非你真的把它确定为热点).坚持使用您当前的技术,这种技术更具可读性.


zar*_*tra 6

嗯...

int remaining = (end - start + bufferSize) % bufferSize;
Run Code Online (Sandbox Code Playgroud)

13个令牌,我赢了吗?

  • 这很简短,尽管在大多数体系结构上增加鸿沟会使您的版本变慢。 (2认同)
  • 因此,使缓冲区大小为2的幂。 (2认同)

MSN*_*MSN 5

如果循环缓冲区大小是 2 的幂,则可以通过在虚拟流中使用startend表示位置而不是循环缓冲区存储中的索引来做得更好。假设startend未签名,则以上变为:

int remaining= bufferSize - (end - start);
Run Code Online (Sandbox Code Playgroud)

实际上,从缓冲区中获取元素要复杂一些,但开销通常足够小,具有 2 倍大小的循环缓冲区(只需使用 进行掩码bufferSize - 1),以使循环缓冲区的所有其他逻辑更加简单和清晰。另外,您可以使用所有元素,因为您不再担心end==start