1. ホーム
  2. c

C言語で循環バッファを実装するには?

2023-08-01 16:35:45

質問

固定サイズ(コンパイル時ではなく、作成時に選択可能)の円形バッファが必要なのですが、これはどんな型のオブジェクトでも保持することができ、以下のようなものである必要があります。 非常に 高性能である必要があります。マルチタスクの組み込み環境ではありますが、協調的な環境であるため、タスク自体が管理できるため、リソースの競合の問題はないと思います。

私の最初の考えは、型 (単純な enum/define) とペイロードへの void ポインターを含む単純な構造体をバッファに格納することでしたが、私はこれをできるだけ速くしたいので、ヒープをバイパスすることを含む提案にオープンです。

私がコードを見た限りでは、CPU に対して大きく最適化されていません。 strcpy() などの C 言語コードをコンパイルしただけで、ハンドコーディングされたアセンブリはありません。

何かコードやアイデアがあれば、ぜひ教えてください。必要な操作は

  • 特定のサイズのバッファを作成する。
  • 末尾に配置する。
  • 頭から取る。
  • カウントを返します。
  • バッファを削除する。

どのように解決するのですか?

バッファをコード化するときに必要な型を列挙できますか。それとも、動的な呼び出しによって実行時に型を追加できるようにする必要がありますか? 前者であれば、バッファをヒープに割り当てられた n 個の構造体の配列として作成し、各構造体は、データ型を識別する enum タグと、すべてのデータ型のユニオンの 2 つの要素から構成されます。 小さな要素のための余分なストレージを失うことは、割り当て/解放とその結果生じるメモリの断片化に対処する必要がないという点で埋め合わされます。 そして、バッファの先頭と末尾の要素を定義する開始と終了のインデックスを追跡し、インデックスをインクリメント/デクリメントするときに mod n を計算することを確認する必要があるだけです。