1

我编写了一个简单的环形缓冲区,它的环形大小为 5 来存储 A 类型的值。现在我必须扩展这个缓冲区来存储 B 类型的值(也是 5 个值)。

为了给出一个概述,我将读取索引和写入索引的变量定义为全局 volatile 和两个用于在环形缓冲区上读取和写入的函数。

我只需要:ring data = int read_ring_data()write_ring_data(int pass_new_data)

volatile 全局变量有助于控制读取和写入的位置。

我的问题是,有没有办法通过简单地重新调整尺寸来重用这些读写函数将其扩展到 2D 缓冲区?我该如何实施?

4

1 回答 1

1

您仍然可以在 C 中以面向对象的风格进行编码,只需将结构用作类,而“方法”只是带有指向类的指针的函数。我将在 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 一致性)具有优势。

可以将“缓冲区标头”结构和数组数据组合到一个分配中(假设缓冲区数据遵循内存中的标头结构),这减少了正在进行的指针取消引用的数量。

于 2011-12-09T11:38:16.527 回答