环形缓冲区是固定大小的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 # 循环 # 数据结构 # 泛型 # 线程 # 多线程 # 可选 # 不安全 # 移除 # 是一个 # 进阶 # 首尾相连 # 是一种 # 还在 # 已被 # 适用于
相关文章: 岳西云建站教程与模板下载_一站式快速建站系统操作指南 建站主机与服务器功能差异如何区分? 如何用y主机助手快速搭建网站? 如何获取开源自助建站系统免费下载链接? 定制建站平台哪家好?企业官网搭建与快速建站方案推荐 GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息? 较简单的网站制作软件有哪些,手机版网页制作用什么软件? 北京建设网站制作公司,北京古代建筑博物馆预约官网? 早安海报制作网站推荐大全,企业早安海报怎么每天更换? 小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊? 如何选择网络建站服务器?高效建站必看指南 网站插件制作软件免费下载,网页视频怎么下到本地插件? 如何通过FTP服务器快速搭建网站? XML的“混合内容”是什么 怎么用DTD或XSD定义 如何通过二级域名建站提升品牌影响力? 如何自定义建站之星网站的导航菜单样式? 动图在线制作网站有哪些,滑动动图图集怎么做? 官网自助建站平台指南:在线制作、快速建站与模板选择全解析 学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站? 如何快速搭建高效WAP手机网站? 学校免费自助建站系统:智能生成+拖拽设计+多端适配 北京营销型网站制作公司,可以用python做一个营销推广网站吗? 如何快速搭建自助建站会员专属系统? 网站建设设计制作营销公司南阳,如何策划设计和建设网站? 如何快速搭建高效可靠的建站解决方案? 长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的? 电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的? 网站网页制作专业公司,怎样制作自己的网页? 可靠的网站设计制作软件,做网站设计需要什么样的电脑配置? 如何选择靠谱的建站公司加盟品牌? c# 服务器GC和工作站GC的区别和设置 极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异? 视频网站app制作软件,有什么好的视频聊天网站或者软件? 建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略 如何在阿里云完成域名注册与建站? 如何选择高效稳定的ISP建站解决方案? 如何在IIS中配置站点IP、端口及主机头? 建站之星导航如何优化提升用户体验? 招商网站制作流程,网站招商广告语? 高性能网站服务器部署指南:稳定运行与安全配置优化方案 已有域名如何快速搭建专属网站? Android自定义listview布局实现上拉加载下拉刷新功能 如何快速使用云服务器搭建个人网站? 如何在腾讯云服务器上快速搭建个人网站? 浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样? 建站之星代理平台如何选择最佳方案? 深圳防火门网站制作公司,深圳中天明防火门怎么编码? 北京制作网站的公司,北京铁路集团官方网站? 如何通过服务器快速搭建网站?完整步骤解析 北京的网站制作公司有哪些,哪个视频网站最好?
*请认真填写需求信息,我们会在24小时内与您取得联系。