Cでは、構造体をクラスとして使用するだけで、オブジェクト指向スタイルでコーディングできます。「メソッド」は、クラスへのポインタを受け取る関数にすぎません。次のように、Cで汎用の「ring-buffer」「class」を作成します。
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キャッシュコヒーレンシ)としての利点があります。
'Buffer Header'構造体と配列データを1つの割り当てに結合することが可能であり(バッファーデータがメモリ内のヘッダー構造体に従うと仮定するだけです)、これにより、進行中のポインター逆参照の量が削減されます。