c# - 如何有效地包装固定大小的循环缓冲区的索引

2019年12月22日 16点热度 0条评论

我有一个固定大小的圆形缓冲区(实现为数组):初始化后,缓冲区将填充有指定的最大元素数量,该元素允许使用单个位置索引来跟踪圆中的当前位置。

什么是访问循环缓冲区中元素的有效方法?这是我当前的解决方案:

int GetElement(int index)
{
    if (index >= buffer_size || index < 0)
    {
        // some code to handle the case
    }
    else
    {
        // wrap the index
        index = end_index + index >= buffer_size ? (index + end_index) - buffer_size : end_index + index;
    }

    return buffer[index];
}

一些定义:
end_index是紧接在圆圈中最后一个元素之后的元素索引(也将被视为与start_index或圆圈的第一个元素相同)。
buffer_size是缓冲区的最大大小。

解决方案如下:

确保缓冲区始终是2的幂并屏蔽掉高位。