1

タイプAの値を格納するためにリングサイズが5の単純なリングバッファをコーディングしました。次に、このバッファを拡張してタイプBの値(これも5つの値)を格納する必要があります。

概要を説明するために、読み取りインデックスと書き込みインデックスの変数をグローバル揮発性として定義し、リングバッファでの読み取りと書き込みの2つの関数を定義しました。

私はする必要があるだけです:ring data = int read_ring_data()そしてwrite_ring_data(int pass_new_data)

揮発性のグローバル変数は、読み取りと書き込みの場所を制御するのに役立ちます。

私の質問は、これらの読み取りおよび書き込み関数を再利用して、単に再ディメンション化することで2Dバッファーに拡張する方法はありますか?どうすれば実装できますか?

4

1 に答える 1

1

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つの割り当てに結合することが可能であり(バッファーデータがメモリ内のヘッダー構造体に従うと仮定するだけです)、これにより、進行中のポインター逆参照の量が削減されます。

于 2011-12-09T11:38:16.527 に答える