代码之家  ›  专栏  ›  技术社区  ›  Dynite

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

  •  6
  • Dynite  · 技术社区  · 16 年前

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

    int remaining = (end > start)
                    ? end-start
                    : bufferSize - start + end;
    
    6 回复  |  直到 16 年前
        1
  •  9
  •   j_random_hacker    16 年前

    如果您担心预测不佳的条件会减慢CPU的进程,您可以使用以下方法:

    int remaining = (end - start) + (-((int) (end <= start)) & bufferSize);
    

        2
  •  6
  •   zaratustra    16 年前

    六羟甲基三聚氰胺六甲醚。。。。

    int remaining = (end - start + bufferSize) % bufferSize;
    

    13枚代币,我赢了吗?

        3
  •  3
  •   MSN    13 年前

    start end 表示虚拟流中的位置,而不是循环缓冲区存储中的索引。假设 终止 如果未签名,则上述内容将变为:

    int remaining= bufferSize - (end - start);
    

    实际上,从缓冲区中取出元素稍微复杂一些,但是开销通常很小,只需要2个大小的循环缓冲区(仅使用掩蔽) bufferSize - 1 )使循环缓冲区的所有其他逻辑更简单、更清晰。另外,您可以使用所有元素,因为您不再担心 end==start !

        4
  •  2
  •   David Thornley    16 年前

    脚注表明,最好将商四舍五入到零,这将使余数为负数。

    因此, (end - start) % bufferSize 这些方法不能可靠地工作。C++没有模块化算术(除了由无符号整数类型提供的意义)。

    j_random_hacker推荐的方法是不同的,看起来不错,但我不知道它在简单性或速度方面是否有任何实际的改进。将布尔值转换为int值非常巧妙,但需要进行心理分析,而且根据编译器和机器的不同,摆弄可能比使用?::更昂贵。

    我想你已经有了最简单最好的版本,我不会改变它。

        5
  •  0
  •   recursive    16 年前

    失去条件:

    int remaining = (end + bufferSize - start - 1) % bufferSize + 1
    

    -1 +1 是为了什么时候的情况 end == start . 在这种情况下,此方法将假定缓冲区为空。根据缓冲区的具体实现,您可能需要对其进行调整,以避免出现逐个关闭的情况。

        6
  •  0
  •   user8935093    7 年前

    旧线程我知道,但认为这可能是有益的。

    不知道这个在C++中实现的速度,但是在RTL中,如果大小是n^ 2,我们会这样做。

    remaining = (end[n] ^ start[n])
                ? start[n-1:0] - end[n-1:0]
                : end[n-1:0] - start[n-1:0];
    

    remaining = if (end[n] ^ start[n]) {
                  start[n-1:0] - end[n-1:0]
                } else { 
                  end[n-1:0] - start[n-1:0] 
                };