いくつかの連続したコンテナーを操作し、この配列内でデータ (およびおそらくフリー レンジ) を含む連続した範囲のインデックスをすばやく取得できるデータ構造を想像してみてください。この範囲を「ブロック」と呼びましょう。各ブロックは、その先頭と末尾のインデックスを認識しています。
struct Block
{
size_t begin;
size_t end;
}
配列を操作すると、データ構造がブロックを更新します。
array view blocks [begin, end]
--------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 [0, 9]
pop 2 block 1 splitted
0 1 _ 3 4 5 6 7 8 9 [0, 1] [3, 9]
pop 7, 8 block 2 splitted
0 1 _ 3 4 5 6 _ _ 9 [0, 1] [3, 6] [9, 9]
push 7 changed end of block 3
0 1 _ 3 4 5 6 7 _ 9 [0, 1] [3, 7] [9, 9]
push 5 error: already in
0 1 _ 3 4 5 6 7 _ 9 [0, 1] [3, 7] [9, 9]
push 2 blocks 1, 2 merged
0 1 2 3 4 5 6 7 _ 9 [0, 7] [9, 9]
プロファイリングの前から、ブロックの取得速度がアプリケーションのパフォーマンスの基礎となることはわかっています。基本的な使用法は次のとおりです。
- 非常に頻繁に連続ブロックを取得
- 非常にまれな挿入/削除
- ほとんどの場合、ブロック数を最小限に抑えたい (断片化を防ぐ)
すでに試したこと:
std::vector<bool>
+std::list<Block*>
. 変更ごとに: true/false を に書き込みvector
、それを for ループでトラバースして を再生成しlist
ます。ブロックのクエリごとに が返されlist
ます。私たちが望んでいたよりも遅い。std::list<Block*>
リストを直接更新するため、トラバースはありません。リストを返します。デバッグ/テストする多くのコード。
質問:
- そのデータ構造には一般的な名前がありますか?
- そのようなデータ構造は既に実装されていますか (デバッグおよびテスト済み)?
- いいえの場合、そのようなデータ構造の高速で堅牢な実装についてアドバイスできますか?
私の説明が明確でない場合は申し訳ありません。
編集
このコンテナーの典型的なアプリケーションは、バッファー (システムまたは GPU メモリ) の管理です。GPU の場合、単一の頂点バッファーに大量のデータを格納してから、一部の領域を更新/無効化できます。描画呼び出しごとに、描画するバッファ内の有効な各ブロックの最初と最後のインデックスを知る必要があり (多くの場合、1 秒間に 10 分の 1 から数百回)、場合によっては (1 秒に 1 回) データのブロックを挿入/削除する必要があります。
もう 1 つのアプリケーションは、カスタムの「ブロック メモリ アロケータ」です。その目的のために、侵入型リンクリストを介して「Alexandrescu A. - Modern C++ Design」本に実装された同様のデータ構造。より良い選択肢を探しています。