环形缓冲区通过数组和头尾指针实现FIFO,利用模运算使索引回绕,结合count变量区分空满状态,支持高效读写操作。

环形缓冲区(Circular Buffer),也叫循环队列,是一种固定大小的先进先出(FIFO)数据结构,常用于生产者-消费者场景、网络数据缓存等。C++ 中实现环形缓冲区可以通过数组加头尾指针的方式高效完成。
基本原理与设计思路
环形缓冲区使用一个固定长度的数组,并维护两个索引:
- head:指向下一个写入位置
- tail:指向下一个读取位置
当 head 或 tail 到达数组末尾时,自动回到 0,形成“环形”效果。通过模运算实现索引回绕。
简单模板实现
#include#include template class CircularBuffer { private: std::vector buffer; size_t head = 0; size_t tail = 0; size_t count = 0; // 当前元素个数 const size_t capacity; public: explicit CircularBuffer(size_t size) : buffer(size), capacity(size) {} // 写入一个元素 bool push(const T& value) { if (isFull()) return false; buffer[head] = value; head = (head + 1) % capacity; ++count; return true; } // 读取一个元素 bool pop(T& value) { if (isEmpty()) return false; value = buffer[tail]; tail = (tail + 1) % capacity; --count; return true; } bool isEmpty() const { return count == 0; } bool isFull() const { return count == capacity; } size_t size() const { return count; } size_t max_size() const { return capacity; } // 查看队首元素(不弹出) T front() const { if (isEmpty()) throw std::runtime_error("Buffer is empty"); return buffer[tail]; } };
使用示例
int main() {
CircularBuffer cb(3);
cb.push(1);
cb.push(2);
cb.push(3);
if (!cb.push(4)) {
std::cout << "Buffer full, cannot push.\n";
}
int val;
while (cb.pop(val)) {
std::cout << val << " ";
}
// 输出: 1 2 3
return 0;
}
关键点说明
该实现的关键在于:
立即学习“C++免费学习笔记(深入)”;
- 用 count 变量区分空和满状态,避免 head == tail 时的歧义
- 所有索引更新都使用 % capacity 实现环形回绕
- 使用模板支持任意类型
- push/pop 返回 bool 值表示操作是否成功
基本上就这些。这种实现方式简洁高效,适合大多数嵌入式或高性能场景。如果需要线程安全,可在外层加互斥锁,或在类中集成 std::mutex。不复杂但容易忽略的是边界判断和 count 的维护。










