我想知道是否有一种更简单的(单一)方法来计算循环缓冲区中的剩余空间而不是这个?
int remaining = (end > start)
? end-start
: bufferSize - start + end;
Run Code Online (Sandbox Code Playgroud) 我需要将不同长度的项目存储在闪存芯片中的循环队列中.每个项目都有它的封装,所以我可以弄清楚它有多大以及下一个项目的开始位置.当缓冲区中有足够的项目时,它将换行到开头.
在闪存芯片中存储循环队列的好方法是什么?
我想存储成千上万件物品的可能性.所以从头开始读到缓冲区的末尾并不理想,因为搜索到最后需要时间.
此外,因为它是圆形的,我需要能够区分第一个项目和最后一个项目.
最后一个问题是它存储在闪存中,因此擦除每个块都非常耗时,并且每个块只能执行一定次数.
我在C中寻找具有以下特征的环形缓冲区实现(或伪代码):
到目前为止,我一直只使用SPSC缓冲区 - 每个生产者一个 - 但我想避免消费者不断旋转以检查所有输入缓冲区的新数据(也许是为了摆脱我的一些编组线程)系统).
我在Intel机器上开发Linux.
c multithreading producer-consumer circular-buffer lock-free
例如:
S = abab, N = 2 S = abca, N = 1 S = aaaa, N = 4
我试过Duval的算法,它的工作时间很长.字符串长度为100000000个字符.
我有数据以环形结构(或循环缓冲区)排列,也就是说它可以表示为循环的序列:...- 1-2-3-4-5-1-2-3 -... .看到这张图片,了解一个5部分的戒指:

我想创建一个窗口查询,可以将滞后和铅项目组合成一个三点数组,但我无法弄清楚.例如,在5部分环的第1部分,滞后/超前序列是5-1-2,或者部分4是3-4-5.
这是一个两个环的示例表,它们具有不同数量的部件(每个环总是多于三个):
create table rp (ring int, part int);
insert into rp(ring, part) values(1, generate_series(1, 5));
insert into rp(ring, part) values(2, generate_series(1, 7));
Run Code Online (Sandbox Code Playgroud)
这是一个几乎成功的查询:
SELECT ring, part, array[
lag(part, 1, NULL) over (partition by ring),
part,
lead(part, 1, 1) over (partition by ring)
] AS neighbours
FROM rp;
ring | part | neighbours
------+------+------------
1 | 1 | {NULL,1,2}
1 | 2 | {1,2,3}
1 | 3 | {2,3,4}
1 | 4 | {3,4,5} …Run Code Online (Sandbox Code Playgroud) sql postgresql circular-buffer circular-list window-functions
环形缓冲区和循环链接列表有什么区别?
环形缓冲区服务于循环链接列表的目的是什么,反之亦然?
我对deque的实现进行了一些搜索.根据这篇文章,deque使用向量的向量.我知道在开始和结束时推送应该是恒定的时间,并且还需要随机访问.我认为循环缓冲区满足所有这些要求,并且更加简单.那么为什么不使用循环缓冲区?
我还发现了增强循环缓冲区.它与deque相比如何?
编辑:好的,所以它与迭代器失效规则有关.它指出:
所有迭代器和引用都是无效的,除非插入的成员位于双端队列的末尾(前面或后面)(在这种情况下,所有迭代器都无效,但对元素的引用不受影响)
我的理解是重载像iter ++这样的运算符,迭代器必须拥有一个指向节点映射的指针和一个指向块的指针,所以如果重新分配节点映射,迭代器就会失效.但由于数据从未移动,因此引用仍然有效.
我正在寻找一个小型应用程序的接收缓冲区的想法,该应用程序通过rs485处理921.6Kbaud的15字节数据包.我正在考虑使用循环缓冲区作为UART ISR和main之间的接口.因为它是一个我想放的微处理器
while (uartindex!=localindex) { do stuff }
Run Code Online (Sandbox Code Playgroud)
在里面
while (;;) {do forever}
Run Code Online (Sandbox Code Playgroud)
部分主要但我被告知这是不可接受的.
人们如何在类似情况下处理他们的蠢货?
是否有可能使用boost::circular_buffer与boost::asio?
具体来说,我想读取固定数量的字节boost::asio::async_write并将它们直接存储在循环缓冲区中而不进行复制。
一些示例代码会非常好!
circular-buffer ×10
c++ ×3
c ×2
algorithm ×1
arm ×1
boost ×1
boost-asio ×1
deque ×1
embedded ×1
flash-memory ×1
lock-free ×1
memory ×1
postgresql ×1
queue ×1
sql ×1
stl ×1
string ×1
uart ×1
windows ×1