2025年环形缓冲区circ_buf详解

环形缓冲区circ_buf详解include stdio h define MAX SIZE 1024 struct circ buf char buf int head int tail Return count in buffer 返回该缓冲区 head tail 之间的差值 define CIRC CNT head tail size stdio h

大家好,我是讯享网,很高兴认识大家。
#include<stdio.h> #define MAX_SIZE 1024 struct circ_buf { char *buf; int head; int tail; }; /* Return count in buffer. */ /*返回该缓冲区head-tail之间的差值*/ #define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1)) /* Return space available, 0..size-1. We always leave one free char as a completely full buffer has head == tail, which is the same as empty. */ /*刨去head-tail之间的大小,整个缓冲区还有多少空间*/ #define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size)) /* Return count up to the end of the buffer. Carefully avoid accessing head and tail more than once, so they can change underneath us without returning inconsistent results. */ /*head到整个缓冲区的结束位置被tail分成了两部分,取这两部分的最小值*/ #define CIRC_CNT_TO_END(head,tail,size) \ ({int end = (size) - (tail); \ int n = ((head) + end) & ((size)-1); \ n < end ? n : end;}) /* Return space available up to the end of the buffer. */ /*返回head到整个缓冲区结尾有多少空间可以用*/ #define CIRC_SPACE_TO_END(head,tail,size) \ ({int end = (size) - 1 - (head); \ int n = (end + (tail)) & ((size)-1); \ n <= end ? n : end+1;}) int main() { int ret = 0; struct circ_buf circ; circ.head = circ.tail = 0; printf("cnt = %d \n", CIRC_CNT(circ.head, circ.tail, MAX_SIZE)); printf("space = %d \n", CIRC_SPACE(circ.head, circ.tail, MAX_SIZE)); printf("cnt to end = %d \n", CIRC_CNT_TO_END(circ.head, circ.tail, MAX_SIZE)); printf("space to end = %d \n\r\n", CIRC_SPACE_TO_END(circ.head, circ.tail, MAX_SIZE)); circ.head = 5; printf("cnt = %d \n", CIRC_CNT(circ.head, circ.tail, MAX_SIZE)); printf("space = %d \n", CIRC_SPACE(circ.head, circ.tail, MAX_SIZE)); printf("cnt to end = %d \n", CIRC_CNT_TO_END(circ.head, circ.tail, MAX_SIZE)); printf("space to end = %d \n\r\n", CIRC_SPACE_TO_END(circ.head, circ.tail, MAX_SIZE)); circ.tail = 5; printf("cnt = %d \n", CIRC_CNT(circ.head, circ.tail, MAX_SIZE)); printf("space = %d \n", CIRC_SPACE(circ.head, circ.tail, MAX_SIZE)); printf("cnt to end = %d \n", CIRC_CNT_TO_END(circ.head, circ.tail, MAX_SIZE)); printf("space to end = %d \n\r\n", CIRC_SPACE_TO_END(circ.head, circ.tail, MAX_SIZE)); circ.head = 15; printf("cnt = %d \n", CIRC_CNT(circ.head, circ.tail, MAX_SIZE)); printf("space = %d \n", CIRC_SPACE(circ.head, circ.tail, MAX_SIZE)); printf("cnt to end = %d \n", CIRC_CNT_TO_END(circ.head, circ.tail, MAX_SIZE)); printf("space to end = %d \n\r\n", CIRC_SPACE_TO_END(circ.head, circ.tail, MAX_SIZE)); circ.tail = 10; printf("cnt = %d \n", CIRC_CNT(circ.head, circ.tail, MAX_SIZE)); printf("space = %d \n", CIRC_SPACE(circ.head, circ.tail, MAX_SIZE)); printf("cnt to end = %d \n", CIRC_CNT_TO_END(circ.head, circ.tail, MAX_SIZE)); printf("space to end = %d \n\r\n", CIRC_SPACE_TO_END(circ.head, circ.tail, MAX_SIZE)); circ.tail = 800; printf("cnt = %d \n", CIRC_CNT(circ.head, circ.tail, MAX_SIZE)); printf("space = %d \n", CIRC_SPACE(circ.head, circ.tail, MAX_SIZE)); printf("cnt to end = %d \n", CIRC_CNT_TO_END(circ.head, circ.tail, MAX_SIZE)); printf("space to end = %d \n\r\n", CIRC_SPACE_TO_END(circ.head, circ.tail, MAX_SIZE)); return 0; } 

讯享网

程序运行结果为:


讯享网

 

小讯
上一篇 2025-03-11 19:53
下一篇 2025-01-09 07:49

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/18983.html