C++ では、再割り当てを処理するより良い方法は、STL ベクトルを使用することだと思います。これにより、連続したストレージの場所が保証されます。
違いを理解するためにいくつか質問があります:
ありがとう、
vector
連続したメモリを持つことが保証されているのは だけです。他の人ではありません。
realloc
C メモリ管理関数です。C++ コードでの使用は推奨されていません。なぜC++ には realloc() に相当するものがないのですか?
ただし、realloc() は、ユーザー定義のコピー コンストラクターを持たないオブジェクトを含む malloc() (および同様の関数) によって割り当てられた配列でのみ機能することが保証されています。また、単純な予想に反して、realloc() は時折その引数配列をコピーすることを覚えておいてください。
連続したメモリも realloc によって保証されるため、それを使用しない理由にはなりません。
ただし、より高いレベルの抽象化であるため、C++ でベクトルを使用することをお勧めします。したがって、コードを記述しやすくなります。
配列タイプのシナリオで realloc (over vector) を使用する唯一の考えられる理由は、生の速度です。それはより速いかもしれません。そして、私は「かもしれない」という言葉を強調します -測定してください、推測しないでください!
ただし、独自の再割り当てを処理する必要があり、これはより多くの作業です。私は、コードを配信してより早く支払いを受け取ることができるのであれば、少し遅く実行されるコードを使用したいと考えています (もちろん、それでも十分に高速に実行されると仮定します)。
std :: vectorの主な利点の1つは、自然に成長することから内部的に再割り当てするときに、現在のサイズの2倍のサイズを選択することです(通常は-ただし常に一定の乗数)。これは、push_backがO(1)コストを償却したことを意味します。
Reallocを使用すると、メモリの割り当て方法をより細かく制御できますが、大きな力には大きな責任が伴います。あなたがしているのがpush_backと同等であり、要素を追加するたびに再割り当てする場合、それは配列への追加ごとにO(N)操作になる可能性があります。
ベクトルだけだと思います。
C++ で realloc を使用することを提案する人を見たことがありません。