C言語で循環バッファを実装するには?
質問
固定サイズ(コンパイル時ではなく、作成時に選択可能)の円形バッファが必要なのですが、これはどんな型のオブジェクトでも保持することができ、以下のようなものである必要があります。 非常に 高性能である必要があります。マルチタスクの組み込み環境ではありますが、協調的な環境であるため、タスク自体が管理できるため、リソースの競合の問題はないと思います。
私の最初の考えは、型 (単純な enum/define) とペイロードへの void ポインターを含む単純な構造体をバッファに格納することでしたが、私はこれをできるだけ速くしたいので、ヒープをバイパスすることを含む提案にオープンです。
私がコードを見た限りでは、CPU に対して大きく最適化されていません。
strcpy()
などの C 言語コードをコンパイルしただけで、ハンドコーディングされたアセンブリはありません。
何かコードやアイデアがあれば、ぜひ教えてください。必要な操作は
- 特定のサイズのバッファを作成する。
- 末尾に配置する。
- 頭から取る。
- カウントを返します。
- バッファを削除する。
どのように解決するのですか?
バッファをコード化するときに必要な型を列挙できますか。それとも、動的な呼び出しによって実行時に型を追加できるようにする必要がありますか? 前者であれば、バッファをヒープに割り当てられた n 個の構造体の配列として作成し、各構造体は、データ型を識別する enum タグと、すべてのデータ型のユニオンの 2 つの要素から構成されます。 小さな要素のための余分なストレージを失うことは、割り当て/解放とその結果生じるメモリの断片化に対処する必要がないという点で埋め合わされます。 そして、バッファの先頭と末尾の要素を定義する開始と終了のインデックスを追跡し、インデックスをインクリメント/デクリメントするときに mod n を計算することを確認する必要があるだけです。
関連
-
C/C++の再定義
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Code::Blocks アプリケーションをコンパイルできない
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] JavaScriptでStackとQueueを実装するには?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み] 効率的な循環型バッファ?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
未定義の `__isoc99_sscanf' への参照
-
[解決済み] mallocで文字列を確保する
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] .aファイル、.soファイルとは何ですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する