玩具网站建设策划书流程,西安做网站一般多少钱,wordpress评论添加验证,win7 iis配置asp.net网站1、概念介绍
在我们需要处理大量数据的时候#xff0c;不能存储所有的数据#xff0c;只能先处理先来的#xff0c;然后将这个数据释放#xff0c;再去处理下一个数据。
如果在一个线性的缓冲区中#xff0c;那些已经被处理的数据的内存就会被浪费掉。因为后面的数据只能…1、概念介绍
在我们需要处理大量数据的时候不能存储所有的数据只能先处理先来的然后将这个数据释放再去处理下一个数据。
如果在一个线性的缓冲区中那些已经被处理的数据的内存就会被浪费掉。因为后面的数据只能往后面放如过要将剩余的数据都往前移动一次那么效率就会低下了。
我们可以使用环形缓冲区将处理完成并且释放掉的内存再利用起来这可以大大减轻我们的内存占用提高我们的内存使用效率。
2、结合代码详细解释
1首先定义一个128个int大小的数组用于充当我们的环形缓冲区 定义r、w下标分别为读写下标索引
#define BUF_LEN 128
static int g_keys[BUF_LEN];
static int r, w;
2构造一个下标后移的宏函数用于移动先前定义的r、w下标 % BUF_LEN对最大容量取余可以实现“环形”的数据读写当读或写下标进行到最末尾的时候能够通过取余最大容量来回归最初操作前面释放的课用空间。
#define NEXT_POS(x) ((x1) % BUF_LEN)
3当读下标和写下标相等的时候表示当前缓冲区为空就如下图所示。空的缓冲区可以进行写但不能读因为没数据可读。每当写入一个数据后写下标w往后移动一下。 往后写了一个数据之后的偏移 移动到下一个要写的地方这里用颜色代表有数据 static int is_key_buf_empty(void)
{return (r w);
}static void put_key(int key)
{if (!is_key_buf_full()){g_keys[w] key;w NEXT_POS(w);}
}
4当写下标w的下一个下标等于读下标的时候表示缓冲区满了这时候需要将读下标r的数据处理掉读掉、释放一个可写的空间厚才可以进行写入。 再往后写一格如果不读的话此时环形缓冲区就满了。 static int is_key_buf_full(void)
{return (r NEXT_POS(w));
}
static int get_key(void)
{int key 0;if (!is_key_buf_empty()){key g_keys[r];r NEXT_POS(r);}return key;
}
三、完整代码
#define BUF_LEN 128
static int g_keys[BUF_LEN];
static int r, w;#define NEXT_POS(x) ((x1) % BUF_LEN)static int is_key_buf_empty(void)
{return (r w);
}static int is_key_buf_full(void)
{return (r NEXT_POS(w));
}static void put_key(int key)
{if (!is_key_buf_full()){g_keys[w] key;w NEXT_POS(w);}
}static int get_key(void)
{int key 0;if (!is_key_buf_empty()){key g_keys[r];r NEXT_POS(r);}return key;
}