c - 从环形缓冲区索引计算“经过”元素的数量
问题描述
抱歉,如果我错过了任何类似的帖子...
我有一个BUFFER_SIZE
存储事件数据的元素环形缓冲区,所以每个事件都会增加buffer_index
,从索引 0 开始。
现在我有一个check_cyclic()
函数需要计算自上次调用以来的事件数.
该函数只知道 current buffer_index
,它静态存储该值以计算差异。
保证BUFFER_SIZE
超过循环时间内可能发生的最大事件数。
所以我们必须考虑在两次循环调用之间可能只有一次溢出。我的实现如下:
void check_cyclic(int buffer_index)
{
static unsigned int last_buffer_index = 0;
static unsigned int events_since_last_call = 0;
if (buffer_index < last_buffer_index)
{ // overflow occured
events_since_last_call = buffer_index + 1 + BUFFER_SIZE - last_buffer_index;
}
else
{
events_since_last_call = buffer_index + 1 - last_buffer_index;
}
last_buffer_index = buffer_index;
//... do something
}
当然,让事件例程本身增加一个计数器并将其重置check_cyclic()
会更有效,但我们假设接口如上所示。
是否有一些更有效的计算方法events_since_last_call
,也许如果我们对环形缓冲区定义一些要求?“大小必须是二的幂”还是什么?
解决方案
推荐阅读
- python - 使用python将嵌套的json文件更改为数据框
- android - RecyclerView 在 ConstraintLayout 中将其下方按钮推出屏幕
- html - asp.net ajax 上传文件总是为空
- yii2 - Yii2 select2.如何在不关闭选择下拉菜单的情况下选择多个项目
- python - 如何使用 matplotlib 和 DataFrame 中的数据创建分组条形图
- javascript - 建议下一个可用日期(最近),但不建议数组中的日期
- java - 我可以附加到服务并在 AndroidStudio 中调试它吗?
- ruby-on-rails - rails 协会有很多不同的模型
- testing - 赛普拉斯:检查元素是否存在并在元素不存在时抛出异常
- spring - 如何在`SkipListener`中获取`JobId`?