环形缓冲区是固定大小的FIFO结构,用取模实现索引回绕;C++中以vector+双索引实现,含push/pop/front等操作,线程不安全需额外同步。
环形缓冲区(Ring Buffer)是一种固定大小的先进先出(FIFO)数据结构,通过首尾相连的数组模拟“循环”行为,避免内存频繁移动。C++中常用 std::vector 或原生数组配合两个索引(读位置 read_idx、写位置 write_idx)实现,关键在于用取模运算处理边界。
以下是一个轻量、泛型、无锁的环形缓冲区模板类:
#include#include template
class RingBuffer { private: std::v ector
buffer_; sizet capacity; size_t readidx = 0; size_t writeidx = 0; sizet size = 0; // 可选:缓存当前元素数量,避免每次计算 public: explicit RingBuffer(sizet capacity) : capacity(capacity), buffer_(capacity) {}
bool empty() const { return size_ == 0; } bool full() const { return size_ == capacity_; } size_t size() const { return size_; } size_t capacity() const { return capacity_; } // 写入一个元素(失败时返回 false) bool push(const T& item) { if (full()) return false; buffer_[write_idx_] = item; write_idx_ = (write_idx_ + 1) % capacity_; ++size_; return true; } // 读取并移除一个元素(失败时返回 false) bool pop(T& item) { if (empty()) return false; item = buffer_[read_idx_]; read_idx_ = (read_idx_ + 1) % capacity_; --size_; return true; } // 查看队首(不移除) bool front(T& item) const { if (empty()) return false; item = buffer_[read_idx_]; return true; }};
使用示例
快速验证功能是否正常:
#includeint main() { RingBuffer
rb(3); rb.push(10); rb.push(20); rb.push(30); // 满了 assert(rb.full()); int x; rb.pop(x); // x == 10 rb.push(40); // 30 被覆盖?不,此时:[40,20,30],read_idx=1 → 下次 pop 是 20 // 实际顺序:入 10→20→30→40,出 10→20→40(30 还在但已被绕过) // 环形缓冲区不保证“覆盖最老”,而是按 FIFO 逻辑:新写入总在写指针处,旧数据自然被丢弃仅当缓冲区满且继续 push}
关键细节说明
- 容量与大小分离:构造时指定最大容量;
size_成员让empty()/full()判断 O(1),比每次算(write_idx_ - read_idx_ + capacity_) % capacity_更清晰可靠- 无需清零内存:只在有效范围内读写,未读数据不关心内容,避免冗余赋值
- 下标更新用取模:
(idx + 1) % capacity_是核心,确保索引自动回绕到 0- 线程安全需额外保护:多线程读写必须加锁(如
std::mutex),或改用原子操作+内存序(进阶,适用于 lock-free 场景)可选增强方向
- 支持
push_n/pop_n批量操作(提升吞吐)- 添加
reserve和resize(注意:环形结构 resize 需重新映射数据)- 用
std::array替代vector实现编译期固定大小(零开销)- 为嵌入式场景提供无动态分配版本(传入外部内存块)
# ai # c++ # ios # stream # 无锁 # Array # 循环 # 数据结构 # 泛型 # 线程 # 多线程 # 可选 # 不安全 # 移除 # 是一个 # 进阶 # 首尾相连 # 是一种 # 还在 # 已被 # 适用于
相关文章: 桂林网站制作公司有哪些,桂林马拉松怎么报名? 简历在线制作网站免费,免费下载个人简历的网站是哪些? 如何在服务器上配置二级域名建站? 建站之星后台密码遗忘如何找回? ppt制作免费网站有哪些,ppt模板免费下载网站? 如何通过宝塔面板实现本地网站访问? mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界? 浅析上传头像示例及其注意事项 建站之星后台管理系统如何操作? 如何彻底卸载建站之星软件? 建站之星代理平台如何选择最佳方案? ,石家庄四十八中学官网? 手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站? 广州商城建站系统开发成本与周期如何控制? 建站之星在线客服如何快速接入解答? 建站之星在线版空间:自助建站+智能模板一键生成方案 公司网站制作费用多少,为公司建立一个网站需要哪些费用? 制作表格网站有哪些,线上表格怎么弄? 如何快速生成橙子建站落地页链接? 如何通过cPanel快速搭建网站? 教学网站制作软件,学习*后期制作的网站有哪些? 为什么Go需要go mod文件_Go go mod文件作用说明 如何在阿里云高效完成企业建站全流程? 如何在VPS电脑上快速搭建网站? jQuery 常见小例汇总 学校为何禁止电信移动建设网站? 建站之星24小时客服电话如何获取? 购物网站制作公司有哪些,哪个购物网站比较好? 如何在局域网内绑定自建网站域名? c# 在ASP.NET Core中管理和取消后台任务 视频网站制作教程,怎么样制作优酷网的小视频? 建站之星安装后界面空白如何解决? 如何通过二级域名建站提升品牌影响力? 家庭建站与云服务器建站,如何选择更优? 网站制作公司,橙子建站是合法的吗? 建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略 如何配置支付宝与微信支付功能? c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗 高端智能建站公司优选:品牌定制与SEO优化一站式服务 建站之星导航菜单设置与功能模块配置全攻略 建站主机SSH密钥生成步骤及常见问题解答? 免费网站制作appp,免费制作app哪个平台好? 网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏? 如何快速搭建高效WAP手机网站吸引移动用户? 如何选择服务器才能高效搭建专属网站? 网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么? 网站企业制作流程,用什么语言做企业网站比较好? 如何通过虚拟机搭建网站?详细步骤解析 再谈Python中的字符串与字符编码(推荐)
*请认真填写需求信息,我们会在24小时内与您取得联系。