您仍然可以在 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 一致性)具有优势。
可以将“缓冲区标头”结构和数组数据组合到一个分配中(假设缓冲区数据遵循内存中的标头结构),这减少了正在进行的指针取消引用的数量。