数据结构:环形缓冲区
当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处理的数据的内存就会被浪费掉。因为后来的数据只能往后排队,如过要将剩余的数据都往前移动一次,那么效率就会低下了,肯定不现实,所以,环形队列就出现了。环形缓冲区是一项很好的技术,不用频繁的分配内存,而且在大多数情况下,内存的反复使用也使得我们能用更少的内存块做更多的事。
头文件
//ringbuffer.h
#ifndef _RINGBUFFER_H_
#define _RINGBUFFER_H_
#include "string.h"
#include "stdint.h"
/*
*声明缓冲区结构体
*param 1:数据缓存地址
*param 2:掩码
*param 3:读指针、写指针
*/
struct Ringbuffer {
uint8_t *data;
uint16_t mask;
uint16_t put_ptr, get_ptr;
};
//初始化缓冲区,绑定内存地址
void Ringbuffer_init(struct Ringbuffer *r, uint8_t *a,uint16_t size);
//清空缓冲区
void Ringbuffer_clear(struct Ringbuffer *r);
//向缓冲区插入数据,写指针+1
uint8_t Ringbuffer_push(struct Ringbuffer *r, uint8_t c);
//从缓冲区获取数据,读指针+1
uint8_t Ringbuffer_pop(struct Ringbuffer *r);
//返回缓冲区总长度
uint16_t Ringbuffer_size(struct Ringbuffer *r);
//返回缓冲区当前存储的元素的个数
uint16_t Ringbuffer_elements(struct Ringbuffer *r);
//返回当前读指针后第n个位置的一个字节,读指针不移动
uint8_t Ringbuffer_get_n(struct Ringbuffer *r,uint16_t n);
//获取当前读指针后长度为n的字符串,读指针移动相应长度
uint8_t Ringbuffer_get_str(struct Ringbuffer *r,uint8_t* dst