全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现一个环形缓冲区(Ring Buffer)?(代码示例)

环形缓冲区是固定大小的FIFO结构,用取模实现索引回绕;C++中以vector+双索引实现,含push/pop/front等操作,线程不安全需额外同步。

环形缓冲区(Ring Buffer)是一种固定大小的先进先出(FIFO)数据结构,通过首尾相连的数组模拟“循环”行为,避免内存频繁移动。C++中常用 std::vector 或原生数组配合两个索引(读位置 read_idx、写位置 write_idx)实现,关键在于用取模运算处理边界。

基础模板实现(线程不安全,适合单线程场景)

以下是一个轻量、泛型、无锁的环形缓冲区模板类:

#include 
#include 

template class RingBuffer { private: std::vector 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;
}

};

使用示例

快速验证功能是否正常:

#include 

int 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 批量操作(提升吞吐)
  • 添加 reserveresize(注意:环形结构 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小时内与您取得联系。