約 10 年前のプロジェクトで、std::vectorの動的割り当てが深刻なパフォーマンスの低下を引き起こしていることがわかりました。この場合、多くの小さなベクトルが割り当てられたので、迅速な解決策は、charその容量の未加工ストレージとして使用されるスタックベースの事前割り当て配列をラップするベクトルのようなクラスを作成することでした。結果はstatic_vector<typename T, std::size_t Max>. いくつかの基本を知っていれば、そのようなことは簡単に書くことができ、ウェブ上でそのような獣をかなり見つけることができます. 実際、現在、 boost にも 1 つがあります。
現在、組み込みプラットフォームで作業していると、たまたまstatic_basic_string. これは、スタックに固定最大量のメモリを事前に割り当て、それを容量として使用する文字列です。
static_vector最初は、これはかなり簡単なはずだと思っていました (結局のところ、既存の に基づいている可能性があります) std::basic_string。std::vectorのインターフェースよりもはるかに複雑です。特に、付属の一連のfind()関数を実装するstd::basic_stringことは、単なる面倒な作業ではありません。
そこで改めて考えさせられました。結局のところ、これがアロケーターが作成された目的です: に基づいて、newおよびdelete他の手段で割り当てを置き換えます。ただし、アロケータ インターフェイスが扱いにくいと言うのは控えめな表現です。それを説明する記事がいくつかありますが、過去 15 年間に自作のアロケータがほとんど見られなかったのには理由があります。
だからここに私の質問があります:
類似を実装する必要がbasic_stringあるとしたら、どのように実装しますか?
- 自分で書く
static_basic_string? - に渡すアロケーターを作成します
std::basic_stringか? - 私が考えていなかった何かをしますか?
- 私が気付いていないブーストから何かを使用しますか?
いつものように、かなり重要な制限があります。組み込みプラットフォーム上にあるため、GCC 4.1.2 に縛られているため、C++03、TR1、およびブースト 1.52 のみを使用できます。