std::realloc
mallocされたメモリにポッド以外のタイプが含まれている場合、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-vector
aと一緒に使用すると、結果 はあまり期待できず、成長中に8〜10回割り当てられます。vector
realloc-vector
最後に、が同じ速度で成長するrealloc-vector
aと一緒に使用される場合、は17〜18回割り当てられます。標準のベクトル動作よりも1つの割り当てをほとんど節約できません。vector
realloc-vector
ハッカーが節約を改善するために割り当てサイズをゲームできることは間違いありませんが、そのようなアロケータを作成して維持するための多大な努力は利益をもたらさないというスティーブに同意します。