【じゅんかんばっふぁ】

循環バッファ とは?

最終更新:
💡 末尾の次は先頭へ。データ置き場をぐるぐる再利用

一定の領域を繰り返し使うバッファ。読み書きの位置を末尾から先頭へ戻して管理する。満杯のときに上書きするか、待つかなどは実装や用途で異なる。

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

参考資料

← 用語集にもどる