2011-12-09 48 views
1

我编写了一个简单的环形缓冲区,环形大小为5,用于存储A型值。 现在我必须扩展此缓冲区以存储B型值(也有5个值)。C环境中的二维环形缓冲区

为了给出一个概述,我已经将读取索引和写入索引的变量定义为全局易失性和两个读写环形缓冲区的函数。

我唯一要做的:ring data = int read_ring_data()write_ring_data(int pass_new_data)

挥发性全局变量有助于控制读取的位置和书写。

我的问题是,有没有办法重新使用这些读写函数来将其扩展到2D缓冲区?我如何实现它?

+5

“2D”是什么意思?像一个有经纬度的甜甜圈,或者像两个叠加的hulahoops? –

+0

好吧...如果你在哪里使用C++,你可以让你的环缓冲区模板类,从而做一些像'ringBuffer >'这将是一个2D缓冲区...但我不知道C有一个相当于模板。我也不认为你真的想要一个多维环缓冲区......你想要解决什么问题? – thecoshman

+2

“易变的全局变量[...]”:这显示了一个糟糕的设计......如何在应用程序中使用2个缓冲区实例?你应该创建一个包含缓冲区和索引的结构体,并且定义了一些将结构体作为第一个参数的函数。 –

回答

1

您仍然可以在C中使用面向对象的风格进行编码,只需使用struct作为类,'methods'只是将指针指向类的函数。我想如下C语言创建一个通用的“环形缓冲区”“类” ..

typedef struct RingBuffer { 
    int elemSize; 
    int headIndex; // index to write 
    int tailIndex; // index to read 
    int maxIndex; 
    void* buffer; 
} 
RingBuffer; 
// initialize a new ring-buffer object 
void RingBuffer_Init(RingBuffer* rb, int elemSize, int maxNum) { 
    rb->elemSize=elemSize; rb->headIndex = 0; rb->tailIndex=0; rb->buffer = malloc(elemSize*maxNum); 
    rb->maxIndex=maxNum; 
} 
void RingBuffer_Read(RingBuffer* rb, void* dstItem){ // copy into buffer, update index 
    void* src=rb->buffer + rb->tailIndex*rb->elemSize; 
    memcpy(dstItem,src,rb->elemSize); 
    rb->tailIndex++; ....//wrapround, assert etc.. 
} 
void RingBuffer_Write(RingBuffer* rb, const void * srcItem) { // copy from buffer,update indices 
}// etc.. 

你必须照顾分配过程中的RingBuffer结构的,有些人可能会做一些宏观如果他们对'init'(等同于C++构造函数)和'shutdown'/'release'函数采用一致的命名方案

当然有很多排列方式..将一个环形缓冲区您可以读取/写入可变大小的元素,也许可以在每个点处将元素大小写入缓冲区。当然也可以随时调整大小,甚至改变元素大小。

尽管创建数据结构的语言支持在C中比在C++中更原始,但有时候重新使用问题来使用简单的数据结构可能会带来性能上的好处。将数据结构视为简单的内存块,并将大小作为参数传递可能会导致编译器内联减少:紧凑型代码可能具有作为内部循环外部使用的默认方法(i-cache一致性)的优点。

将'Buffer Header'结构和阵列数据组合成一个分配(假设缓冲区数据跟随内存中的头部结构),这将减少指针去引用的数量。

+0

好的,谢谢..让我沿着这些方向尝试 – user489152