问题描述
我正在尝试修改固定大小的环形缓冲区结构(用C ++编写),以便它能够根据要求处理调整大小。首先,我想知道这种情况是否真的有可能实现?因为我在互联网上到处都读到环形缓冲区必须固定大小,并且调整缓冲区大小可能会导致指针无效。
当前实施:
- 具有预定义大小的向量,称为记录的类类型的指针
- 用于保留记录总数的索引。索引从1开始,最高可以达到40亿
- 函数getSlot()-此函数在由以下公式计算的索引(rindex)处创建缓冲区(记录指针) (index-1)%大小并增加原始索引。它返回恰好在增加索引之前的index值。
- getbuffer(int slot):这将从get slot中获取返回的值,以(slot-1)%的大小计算缓冲区索引,并获取该缓冲区,并在计算出的索引处返回Record指针缓冲区。
我正在尝试写一个新函数为set_buffer_size(int new_size)
如果new_size>当前大小,我可以调整它的大小,并且不会丢失任何Records指针
if(new_size 问题:无法提出通用解决方案来处理记录的复制并将其放置在调整大小的数组中。另一种情况是当缓冲区已经被回收并且当前元素在向量的中间时。例如, 1 2 3 4 5 6 7 8 9 10
预期-6 7 8 9 10 2。如果向量的初始大小为10,这是第23条记录,我想将向量的大小调整为5 21 22 23 14 15 16 17 18 19 20 预期-19 20 21 22 23 另一个问题-万一我可以按预期成功存储所有记录。下次调用getSlot时,例如对于场景2,理想情况下,它应该在索引0(当前坐在19的位置)上创建一个缓冲区,并返回23,但是根据计算[(23-1)%5 = 2],它将创建索引2的缓冲区,记录21的指针位于该缓冲区。然后,当调用get_buffer(23)时,它将返回索引2处的缓冲区。 尺寸的变化弄乱了此计算(索引-1)%的尺寸。 请提供建议。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)