环形buffer的实现
来源:互联网 发布:设计店铺的软件 编辑:程序博客网 时间:2024/05/17 07:24
项目需要,抽空了解了环形buffer,个人理解就是一个环形队列,先入先出,满足生产者-消费者模型。
环形buffer的好处:充分利用分配的内存,减少内存分配次数,从而减少内存碎片的产生。
环形buffer的实现,最重要的是记录入口和出口的指针,以及超过buffer长度的边界判断。
下面为环形buffer的简易实现代码:
其中rbuffer为环形buffer的定义,init_ring_buffer()、input_data()、output_data()分别实现了环形buffer的初始化、输入和输出数据。
main()函数中测试了环形buffer的上述功能。
#include <stdio.h>#include <stdlib.h>#include <string.h>//definition of ring buffertypedef struct ring_buffer{char *buffer; //buffer to store the dataint in_pos; //flag to track the input pointerint out_pos; //flag to track the output pointint size; //buffer sizeint data_num; //the used buffer size}rbuffer;int init_ring_buffer(rbuffer * rbuf, int size) //init buffer{rbuf->buffer = (char *)malloc(size * sizeof(char));if(rbuf->buffer == NULL){printf("Cannot allocte memory!\n");exit(1);}rbuf->in_pos = 0;rbuf->out_pos = 0;rbuf->data_num = 0rbuf->size = size;return 0;}rbuffer *input_data(rbuffer *rbuf, char *buf, int len) //input data{if(len <= 0)return rbuf;if(len <= rbuf->size - rbuf->in_pos){memcpy(rbuf->buffer + rbuf->in_pos, buf, len);rbuf->in_pos = (rbuf->in_pos + len) % rbuf->size;}else{memcpy(rbuf->buffer + rbuf->in_pos, buf, rbuf->size - rbuf->in_pos);memcpy(rbuf->buffer, buf + rbuf->size - rbuf->in_pos, len - (rbuf->size - rbuf->in_pos));rbuf->in_pos = len - (rbuf->size - rbuf->in_pos);}rbuf->data_num += len;return rbuf;}rbuffer *output_data(rbuffer *rbuf, char *buf, int len) //out put data{if(len <= 0)return rbuf;if(len >= rbuf->data_num){printf("No enough data!\n");return rbuf;}if(len < rbuf->size - rbuf->out_pos){memcpy(buf, rbuf->buffer + rbuf->out_pos, len);rbuf->out_pos = (rbuf->out_pos + len) % rbuf->size}else{memcpy(buf, rbuf->buffer + rbuf->out_pos, rbuf->size - rbuf->out_pos);memcpy(buf + rbuf->size - rbuf->out_pos, rbuf->buffer, len - (rbuf->size - rbuf->out_pos));rbuf->out_pos = len - rbuf->out_pos;}rbuf->data_num -= len;return rbuf;}void show_buf(char *buf, int num){int i;for(i = 0; i < num; i++){printf("%d ", buf[i]);}printf("\n");}int main(){int ret;char testbuf1[3] = {1, 2, 3};char testbuf2[5] = {1, 2, 3, 4, 5};char outbuf[5];rbuffer *mbuf;mbuf = (rbuffer *)malloc(sizeof(rbuffer));if(ret = init_ring_buffer(mbuf, 5) !=0){printf("malloc error\n");return 1;}mbuf = input_data(mbuf, testbuf1, 2 );show_buf(mbuf->buffer, 5);mbuf = input_data(mbuf, testbuf2, 5 );show_buf(mbuf->buffer, 5);mbuf = output_data(mbuf, outbuf, 2);show_buf(outbuf,2);mbuf = output_data(mbuf, outbuf, 2);show_buf(outbuf,2);mbuf = output_data(mbuf, outbuf, 4);show_buf(outbuf,4);return 0;}
0 0
- 环形buffer的实现
- 环形buffer的管理
- (转载)环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- (转载)环形缓冲区的实现原理(ring buffer) .
- 环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- 环形缓冲区的实现原理(ring buffer)
- linux网络编程--Circular Buffer(Ring Buffer) 环形缓冲区的设计与实现
- 环形buffer的两种设计方式
- 一个特殊需求的环形Buffer设计
- 环形缓冲区的实现
- 环形缓冲区的实现
- 环形缓冲区的实现
- java提高篇(二九)-----Vector
- 手机照片丢失怎么恢复丨万能恢复软件免费版丨
- 让自己组织Sw所示把电参
- php面试经典问题
- matlab对数据分布检验代码:正态分布,γ分布,泊松分布,指数分布,rayleigh分布
- 环形buffer的实现
- 【HDU】3987 Harry Potter and the Forbidden Forest 最小割
- android x86 环境
- 程序员职业路径该如何抉择?Career Path of a Programmer
- 迭代器
- ORACLE备份保留策略(RETENTION POLICY)
- java位运算应用
- 电脑与CDI9600变频器的RS485通讯
- C# 中的委托和事件(详解,附实例)