46

allocatorスタック上に存在する(固定サイズの)バッファーを使用するC++標準ライブラリに準拠することが実用的かどうか疑問に思いました。

どういうわけか、この質問はSOでまだこのように尋ねられていないようですが、他の場所で暗黙的に回答されている可能性があります。

したがって、基本的に、私の検索で、固定サイズのバッファーを使用するアロケーターを作成できるはずです。さて、一見すると、これは、スタック上に「存在する」固定サイズのバッファを使用するアロケータを持つこと可能であることを意味するはずですが、そのような実装は広く普及していないようです

私が意味することの例を挙げましょう:

{ ...
  char buf[512];
  typedef ...hmm?... local_allocator; // should use buf
  typedef std::basic_string<char, std::char_traits<char>, local_allocator> lstring;
  lstring str; // string object of max. 512 char
}

これはどのように実装できますか?


この他の質問への回答(R. Martinho Fernandesに感謝)は、クロムソースからのスタックベースのアロケータにリンクしています:http ://src.chromium.org/viewvc/chrome/trunk/src/base/stack_container.h

ただし、このクラスは非常に独特なようです。特にStackAllocator 、デフォルトのctorがないためです。そこで、すべてのアロケータクラスにデフォルトのctorが必要だと考えていました。

4

6 に答える 6

2

それは本当にあなたの要件に依存します、あなたが望むならあなたがスタック上でのみ動作するアロケータを作成できることを確認してください、しかしヒープオブジェクトがそうであるように同じスタックオブジェクトがプログラムのどこからでもアクセスできないのでそれは非常に制限されます。

この記事はアロケータを非常によく説明していると思います

http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

于 2011-11-08T11:35:11.360 に答える
2

これは、実際には非常に有用なプラクティスであり、ゲームなどのパフォーマンスの高い開発でかなり使用されています。スタック上またはクラス構造の割り当て内にメモリをインラインで埋め込むことは、コンテナーの速度や管理にとって重要な場合があります。

あなたの質問に答えるには、stl コンテナーの実装に帰着します。コンテナーがインスタンス化するだけでなく、メンバーとしてアロケーターへの参照も保持する場合は、固定ヒープを作成しても問題ありません。これは仕様の一部ではないため、常にそうであるとは限りません。そうしないと問題になります。1 つの解決策は、コンテナー、ベクター、リストなどを、ストレージを含む別のクラスでラップすることです。次に、アロケータを使用してそこから描画できます。これには、多くのテンプレート マジック (tm) が必要になる場合があります。

于 2013-12-25T01:08:43.413 に答える
2

スタックベースの STL アロケータの有用性は非常に限られているため、多くの先行技術が見つかるとは思えません。あなたが引用した単純な例でさえ、後でイニシャルをコピーしたり長くしたりすることにした場合、すぐに爆発しますlstring

連想コンテナ (内部的にツリーベース) などの他の STL コンテナやvectordeque1 つまたは複数の連続した RAM ブロックを使用する STL コンテナの場合、メモリ使用量のセマンティクスは、ほとんどすべての実世界での使用において、スタック上ですぐに管理不能になります。

于 2011-11-08T12:21:26.557 に答える