私が自分自身を書く前に、私は皆に尋ねます。
STL ベクトルとほとんど同じですが、スタック上の配列にデータを格納する C++ クラスを探しています。ある種の STL アロケーター クラスも機能しますが、静的に割り当てられたスレッドごとのヒープであっても、あらゆる種類のヒープを回避しようとしています (ただし、そのうちの 1 つが私の 2 番目の選択肢です)。スタックはより効率的です。
ベクトルを使用する現在のコードの代わりに、ほとんどドロップする必要があります。
私が自分で書こうとしていたことについては、次のようなことを考えていました。
char buffer[4096];
stack_vector<match_item> matches(buffer, sizeof(buffer));
または、クラスにバッファ領域が内部的に割り当てられている可能性があります。次に、次のようになります。
stack_vector<match_item, 256> matches;
スペースがなくなると std::bad_alloc がスローされると思っていましたが、それは決して起こらないはずです。
アップデート
Chromium の stack_container.h を使用するとうまくいきます!
私が自分でこのようにすることを考えていなかった理由は、STL コレクション コンストラクターへのアロケーター オブジェクト パラメーターを常に見落としていたからです。テンプレート パラメーターを使用して静的プールを実行したことは数回ありますが、オブジェクト パラメーターを実際に使用するコードを見たり書いたりしたことはありません。私は何か新しいことを学びました。とてもかっこいい!
コードは少し乱雑で、なんらかの理由で GCC によって、アロケーターをベクターのアロケーター パラメーターに構築するのではなく、実際の項目として宣言するように強制されました。それは次のようなものから始まりました:
typedef std::pair< const char *, const char * > comp_list_item;
typedef std::vector< comp_list_item > comp_list_type;
comp_list_type match_list;
match_list.reserve(32);
これに:
static const size_t comp_list_alloc_size = 128;
typedef std::pair< const char *, const char * > comp_list_item;
typedef StackAllocator< comp_list_item, comp_list_alloc_size > comp_list_alloc_type;
typedef std::vector< comp_list_item, comp_list_alloc_type > comp_list_type;
comp_list_alloc_type::Source match_list_buffer;
comp_list_alloc_type match_list_alloc( &match_list_buffer );
comp_list_type match_list( match_list_alloc );
match_list.reserve( comp_list_alloc_size );
そして、新しいものを宣言するたびに、それを繰り返さなければなりません。しかし、それは私が望んでいたように機能します。
stack_container.h に StackVector が定義されていることに気付き、それを使用してみました。ただし、ベクターから継承したり、同じメソッドを定義したりしないため、ドロップインの代替品ではありませんでした。ベクトルを使用してすべてのコードを書き直したくなかったので、あきらめました。