首页 > 后端开发 > C++ > 正文

c++中怎么实现一个环形缓冲区(ring buffer)_c++环形队列实现方法

裘德小鎮的故事
发布: 2025-10-12 22:05:02
原创
261人浏览过
环形缓冲区使用固定数组和头尾指针实现FIFO,通过取模运算形成循环,利用full标志区分满/空状态,支持高效读写操作,适用于生产者-消费者等场景。

c++中怎么实现一个环形缓冲区(ring buffer)_c++环形队列实现方法

环形缓冲区(Ring Buffer),也叫循环队列,是一种固定大小的先进先出(FIFO)数据结构,常用于生产者-消费者场景、串口通信、音频处理等。C++ 中实现环形缓冲区可以通过数组加头尾指针的方式高效完成。

基本原理

环形缓冲区使用一个固定大小的数组,并维护两个索引:
  • head:指向下一个写入位置
  • tail:指向下一个读取位置
通过取模运算(%)实现“环形”效果,当指针到达末尾时自动回到开头。

简单模板实现

下面是一个线程不安全但高效的环形缓冲区模板实现:

template <typename T, size_t N>
class RingBuffer {
private:
    T buffer[N];
    size_t head = 0;
    size_t tail = 0;
    bool full = false;
<p>public:
// 判断是否为空
bool empty() const {
return !full && (head == tail);
}</p><pre class='brush:php;toolbar:false;'>// 判断是否已满
bool full() const {
    return full;
}

// 写入一个元素
bool push(const T& item) {
    if (full) return false;
    buffer[head] = item;
    head = (head + 1) % N;
    if (head == tail) {
        full = true;
    }
    return true;
}

// 读取一个元素
bool pop(T& item) {
    if (empty()) return false;
    item = buffer[tail];
    tail = (tail + 1) % N;
    full = false;
    return true;
}

// 返回当前元素数量
size_t size() const {
    if (full) return N;
    return (head >= tail) ? (head - tail) : (N - tail + head);
}
登录后复制

};

使用示例

你可以这样使用这个环形缓冲区:
#include <iostream>
<p>int main() {
RingBuffer<int, 4> rb;</p><pre class='brush:php;toolbar:false;'>rb.push(1);
rb.push(2);
rb.push(3);

int val;
while (rb.pop(val)) {
    std::cout << val << " ";
}
// 输出:1 2 3
return 0;
登录后复制

}

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译

立即学习C++免费学习笔记(深入)”;

关键细节说明

实现环形缓冲区时要注意以下几点:
  • 满/空判断:头尾相等时可能为空也可能为满,这里用一个额外的 full 标志区分
  • 取模运算:使用 % N 实现索引回绕,注意性能(可对 2 的幂用位运算优化)
  • 线程安全:上述实现非线程安全,多线程环境下需加锁或使用原子操作
  • 异常安全:拷贝构造和赋值操作要考虑异常安全性,必要时使用 RAII

如果需要线程安全版本,可以加上互斥锁:

#include <mutex>
<p>// 在类中添加:
mutable std::mutex mtx;</p><p>bool push(const T& item) {
std::lock_guard<std::mutex> lock(mtx);
// 原逻辑...
}</p>
登录后复制

基本上就这些。环形缓冲区实现不复杂但容易忽略边界条件,关键是处理好满/空状态和索引回绕。

以上就是c++++中怎么实现一个环形缓冲区(ring buffer)_c++环形队列实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号