C++循环缓存实现与优化

本文介绍了C++中环形缓冲区(RingBuffer)的实现,通过结合定长数组和STL vector,保证高内存利用率并避免数据丢失。在内存剩余空间小于总长度1/3时,从vector拉取内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

循环数组主要是数据结构时一个定长数组+读和写的指针一般用于缓存,但是如果超过数组长度就会发生丢失。为了防止丢失,需要再加一层缓存。

一、说明

  1. 统一缓存的结构(Msg)使用一个长度加字节数组的指针
  2. RingBuffer主要结构为定长数组+读写指针,为了不发生丢失再使用C++STL中vector来再做一次缓存
  3. 当定长数组中的剩余空间小于总长度的1/3,才到vector中拉取内容。
  4. 主要优点:内存使用率高,不会发生丢失。

二、代码

1.实现

#pragma once
#include <vector>
#include <mutex>
#include <stdlib.h>
#include <string.h>
class Msg{
   
public:
    unsigned int size;
    const char* ptr;
    unsigned long seq;
public:
	Msg():size(0),ptr(NULL),seq(0){
   }
    Msg(unsigned int s, const char *p, unsigned long sq):size(s), ptr(p), seq(sq){
   }
};

template <unsigned int QueueSize = 1024>
class RingBuffer{
   
private:
    std::mutex mtx; // 锁
    std::vector<Msg> msgBuffer;// 缓存
    Msg msgQueue[QueueSize];// 环形数组
    unsigned int m_writeIdx;//写索引 可写的地址
    unsigned int m_readIdx;//读索引 可读的地址
    bool m_empty;// 写索引==读索引
    bool m_full;// 写索引==读索引
public:
    RingBuffer(){
   
        m_readIdx =0;
        m_writeIdx = 0;
        m_empty = false;
        m_full = false;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值