私は C++ で共有ライブラリを作成しており、ライブラリによって行われるすべてのヒープ割り当てを、ライブラリの特定の部分の初期化時に割り当てられる単一の連続したブロックに配置するという (主に教育的な) 目標を持っています。malloc
これは、最初に 2 つのスタック (1 つは永続メモリ用の大きくポップできないスタック、もう 1 つはセカンダリ ランタイム スタックとして余分な機械を備えたスタック) と、半永続データ用のバイナリ バディ システムを実装する単一のもので実現します。
この自己課せられた制約を考慮して、これが過度に XY 状況に変わる前に、私が解決しようとしている問題について説明します。私のライブラリには、いくつかのプロパティ、構造体、たとえばA
とを持つことができるこれらのアイテムがありB
ます。個別の継承による OO アプローチの代わりに、ECS のようなデータのフラット化を行っています。アイテムは単なる ID であり、私は各プロパティを別々の配列に持っている人を記録しています。したがって、5 つのアイテムがあり、おそらく {1, 3, 4, 5} がプロパティ A を持ち、{2, 3, 4} がプロパティ B を持つ場合、コードは次のようになります。
struct A;
struct B;
int whoHasA[] = {1, 3, 4, 5, 0};
A propertyA[] = {A1, A3, A4, A5, A::null()};
int whoHasB[] = {2, 3, 4, 0};
B propertyB[] = {B2, B3, B4, B::null()};
これらの配列はすべて、配列に例示されているように、固定サイズを与え、null 終了によってプログラム関連のサイズを「動的に」変更することにより、私の制約に従って割り当てることができます (これはスパースのアドホックな実装に過ぎないことを認識しています)。配列(プログラムを書いた時点でサイズが分かっているので気に入っています)。さて、私のライブラリに必要な機能は次のとおりです。ユーザーがアイテムのインスタンスを (最大数まで) 作成し、事後にプロパティを追加/削除できるようにしたいと考えています。
そのために、ユーザーが面倒な ID ではなく名前で項目を参照できるようにしたいと考えています。次に、API で次の関数を公開する必要があります
void CreateItem(const char* name); //Store item name in a registry
void GiveProperty(const char* name, A property); //Append item's id to whoHasA and property to propertyA
void GiveProperty(const char* name, B property); //Append item's id to whoHasB and property to propertyB
同様の機能をスクリプト (現在は Lua) に公開したいので、名前をメモリに保存する必要があります。頭に浮かぶ解決策は、文字列をキーとして、アイテム ID を値として持つ、ある種の連想マップです。マップ自体とキーとしてstd::unordered_map
の動的割り当てのために、私は避けてきました。std::string
現在、私が行っているのは、書き込み対象の を定義し、const char** itemNames
それらを基本的な線形検索して、すべてのエントリCreateItem
を比較するchar
ことだけです。char
私はそれをベンチマークしておらず、特に面倒だとは思いませんが、より適切で(理論的に)より効率的な、よりエレガントなソリューションを期待してこの質問をしています。