I've been writing ring buffers wrong all these years (2016)
5 months ago
- #data-structures
- #optimization
- #ring-buffer
- 实现单元素环形缓冲区具有挑战性,传统实现方式会浪费存储空间。
- 两种常见环形缓冲区实现:双索引(读/写)数组 vs 单索引加长度数组。
- 传统双索引实现需浪费一个数组元素来区分空/满状态。
- 单索引加长度方案虽能利用全部容量,但使并发访问复杂化。
- 创新方案:使用两个无掩码的无限增长索引,仅在数组寻址时进行掩码操作。
- 无掩码索引优势:代码更简洁、零空间浪费,但需满足容量为2的幂且依赖无符号整数回绕特性。
- 该技术早在2004年就有记载,却仍未得到广泛应用。
- 可能原因:传统思维定式、对整数溢出的顾虑,或非2的幂容量需求。
- 通过模运算可支持非2的幂容量,但会牺牲性能。