【じゅんかんばっふぁ】
循環バッファ とは?
最終更新:
💡 末尾の次は先頭へ。データ置き場をぐるぐる再利用
一定の領域を繰り返し使うバッファ。読み書きの位置を末尾から先頭へ戻して管理する。満杯のときに上書きするか、待つかなどは実装や用途で異なる。
📌 このページのポイント
- 一定の領域を、読み書きの位置を戻しながら使う
- 読み出す位置と、次に書く位置を管理する
- 満杯時の上書き・待機・拒否は、方式により違う
- 空・満杯の区別と、同時に読み書きするときの同期が必要
普通の配列と、どこが違うの?
配列などの領域に、読み書きの位置を付けて使うんだ。位置が末尾まで進んだら、次は先頭に戻る。回転寿司のレーンのようなイメージだけれど、メモリ自体が物理的に丸く配置されるわけではないよ。
満杯になったら、古いデータを消すの?
最新の履歴を残す用途では、古いものを上書きする方式があるよ。Boostのcircular_bufferはその例。一方、空きができるまで待つ、新しいデータを断るなどの方式もある。未読のデータを失ってよいかで決めるので、循環することと自動上書きは同じ意味ではないんだ。
図の読み書きの位置は、何を示しているの?
番号0〜5の6個の置き場を使う例だよ。A、B、Cの順で読み、次は3番に書く。5番まで進んだ後は0番に戻る。読み書き位置の名前や、現在の位置・次の位置のどちらを指すかは実装で違うので、ここでは「次に読む」「次に書く」と明記したよ。
読み位置と書き位置が同じなら、空なの?
メモリ確保もロックも、要らなくなる?
領域を先に確保して使い回せるけれど、最初の確保や保存するデータ自身の確保まで不要になるわけではないよ。また、複数の処理が同時に読み書きする場合は同期が必要。ロックを使うか、専用の原子操作やメモリ順序を使うかは実装の条件によるんだ。
まとめ:ざっくりこれだけ覚えればOK!
「循環バッファ」って出てきたら「末尾から先頭へ戻りながら、同じデータ置き場を再利用する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Circular Buffer / Ring Buffer」 = 環状バッファ
💬 配列が円環のように循環するからCircular(環状の)Bufferと呼ばれるんだよ