全网整合营销服务商

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

免费咨询热线: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  # 循环  # 数据结构  # 泛型  # 线程  # 多线程  # 可选  # 不安全  # 移除  # 是一个  # 进阶  # 首尾相连  # 是一种  # 还在  # 已被  # 适用于 


相关文章: 如何通过虚拟主机快速搭建个人网站?  三星网站视频制作教程下载,三星w23网页如何全屏?  如何在阿里云高效完成企业建站全流程?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  公司网站的制作公司,企业网站制作基本流程有哪些?  个人网站制作流程图片大全,个人网站如何注销?  一键网站制作软件,义乌购一件代发流程?  如何在万网开始建站?分步指南解析  已有域名建站全流程解析:网站搭建步骤与建站工具选择  香港服务器如何优化才能显著提升网站加载速度?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  制作网站的公司有哪些,做一个公司网站要多少钱?  建站之星如何通过成品分离优化网站效率?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  建站DNS解析失败?如何正确配置域名服务器?  *服务器网站为何频现安全漏洞?  内部网站制作流程,如何建立公司内部网站?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  学校建站服务器如何选型才能满足性能需求?  如何通过商城免费建站系统源码自定义网站主题?  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何用虚拟主机快速搭建网站?详细步骤解析  网站制作的步骤包括,正确网址格式怎么写?  家庭建站与云服务器建站,如何选择更优?  如何用VPS主机快速搭建个人网站?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何在腾讯云服务器上快速搭建个人网站?  ,制作一个手机app网站要多少钱?  如何选择高性价比服务器搭建个人网站?  ,巨量百应是干嘛的?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站之星如何快速生成多端适配网站?  如何确保西部建站助手FTP传输的安全性?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  高性价比服务器租赁——企业级配置与24小时运维服务  网站制作公司排行榜,抖音怎样做个人官方网站  如何在建站主机中优化服务器配置?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  制作网站的软件免费下载,免费制作app哪个平台好?  如何在新浪SAE免费搭建个人博客?  微信小程序 input输入框控件详解及实例(多种示例)  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站之星展会模版如何一键下载生成?  如何快速生成橙子建站落地页链接?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。