std::reallocmallocされたメモリにポッド以外のタイプが含まれている場合、C++では危険です。唯一の問題は、std::reallocメモリをその場で拡張できない場合に型デストラクタを呼び出さないことです。
ささいな回避策はtry_realloc関数です。in situで拡張できない場合、新しいメモリをmallocする代わりに、単にfalseを返します。この場合、新しいメモリを割り当てることができ、オブジェクトは新しいメモリにコピー(または移動)され、最後に古いメモリが解放されます。
これは非常に便利なようです。 std::vectorこれを大いに活用して、すべてのコピー/再割り当てを回避できる可能性があります。
プリエンプティブ難燃剤:技術的には、これはBig-Oのパフォーマンスと同じですが、ベクトルの成長がアプリケーションのボトルネックである場合、Big-Oが変更されていない場合でも、2倍のスピードアップが最適です。
しかし、のように機能するcapiが見つかりませんtry_realloc。
私は何かが足りないのですか?私try_reallocが想像するほど役に立たないのですか?使用できなくなる隠れたバグはありtry_reallocますか?
さらに良いことに、次のように機能する、文書化されていないAPIはありますtry_reallocか?
注:私は明らかに、ここのライブラリ/プラットフォーム固有のコードにいます。try_realloc本質的に最適化であるため、私は心配していません。
更新:vector reallocを使用する方が効率的
かどうかについてのSteve Jessopsのコメントに続いて、テストする概念実証を作成しました。はrealloc-vectorベクトルの成長パターンをシミュレートしますが、代わりに再割り当てするオプションがあります。ベクトル内の最大100万要素までプログラムを実行しました。
比較のためvectorに、100万要素に成長しながら19回割り当てる必要があります。
結果は、ヒープを使用する唯一のものである場合、realloc-vector結果は素晴らしいものであり、100万バイトのサイズに成長しながら3〜4の割り当てが行われます。
を66%の速度で成長するrealloc-vectoraと一緒に使用すると、結果 はあまり期待できず、成長中に8〜10回割り当てられます。vectorrealloc-vector
最後に、が同じ速度で成長するrealloc-vectoraと一緒に使用される場合、は17〜18回割り当てられます。標準のベクトル動作よりも1つの割り当てをほとんど節約できません。vectorrealloc-vector
ハッカーが節約を改善するために割り当てサイズをゲームできることは間違いありませんが、そのようなアロケータを作成して維持するための多大な努力は利益をもたらさないというスティーブに同意します。