c++ 实现高效缓存(链式buffer)

本文介绍了如何使用C++实现链式缓存,特别适用于处理不定长度的网络数据接收。通过创建固定大小的缓存链,并用一个管理器进行维护,这种缓存方式能有效适应动态的数据需求。示例代码和使用方法参考了GitHub上的EventServer项目,包括SocketBuffer.h、Session.h和SeNet.cpp文件,其中EventRead和EventWrite函数展示了实际的读写操作。
摘要由CSDN通过智能技术生成

如果我们从网络端接收的数据是不定长度的,不能提前分配好网络缓存大小,则可以选择使用链式缓存的实现方式。链式缓存主要是分配固定大小的缓存链保存数据,一个管理器去管理这些缓存链。

链式缓存示例:

//一种链式缓冲
//ringbuffer是固定长度,不能够扩展,链式buffer可以任意扩充
/**
 * buffer
 *     *first--chain buffer [1024]
 *             |--chain buffer
 *             |--chain buffer
 *     *datap--|--chain buffer
 *     *last---chain buffer
 * */

#include <cstdio>
#include <iostream>
#include <cstring>


using namespace std;

struct chain_buffer_mgr
{
	struct chain_buffer* first;
	struct chain_buffer* last;
	struct chain_buffer* last_datap; // 指向最后保存数据的缓存链
	size_t total_len;                // 所有链缓存保存的总共数据
};

struct chain_buffer
{
	int read_pos;
	int write_pos;
	struct chain_buffer* next;
	size_t buffer_len;
	char* buffer;
};

#define BUFFER_CHAIN_SIZE sizeof(struct chain_buffer)
#define BUFFER_CHAIN_EXTRA (t, c)(t *)((struct chain_buffer *)(c) + 1) //指向chain buffer 缓存区

class ChainBuffer
{
public:
	ChainBuffer() {}
	~ChainBuffer(){}
	void Clear()
	{
		struct chain_buffer* first = m_oBufferMgr.first;
		while (first != nullptr)
		{
			delete[] first->buffer;
			struct chain_buffer* next = first->next;
			delete first;
			first = next;
		}
		m_oBufferMgr.first = nullptr;
		m_oBufferMgr.last_datap =
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值