newで割り当てられた文字配列があるとします。次に、配列のサイズを変更する場合は、次の2つのうちどちらが最適な方法ですか。1. realloc関数を使用または 2.新しい配列を割り当て、古い配列から新しい配列にデータをコピーしてから、古い配列を削除します。
4 に答える
malloc (not new) を使用してブロックを割り当ててから、realloc を使用します。realloc は、ブロックの後に拡張用に使用できる空き容量を認識しています。
s2 = realloc(s,<size>);
if (s2) {
s = s2;
}
else {
free up s and handle the error
}
私が見たほとんどのコードは、realloc の失敗を正しく処理していません。
new で割り当てられたバッファに realloc を移植可能に適用することはできません。したがって、あなたの2番目のオプションのみが実行可能です.
std::vector および std::string への切り替えを検討してください。
Cの観点から全体の問題について考えていると思います。
を使用して配列を扱っている場合vector
、それは動的であり、質問で述べた問題を回避します
例えば
vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long
realloc
最初のオプションは、ブロックの後に十分な空き領域がないことがわかった場合のコピーも意味します。(malloc
配列の割り当てに使用したとしても、これはrealloc
まったく使用する唯一の正しいオプションです。)
ただし、再割り当てごとに配列のサイズを 2 倍にする (またはそのサイズに定数 > 1 を掛ける) 場合、「配列を 1 増やす」操作は平均して一定の時間を使用します。定数償却時間を検索します。
初期サイズ n の配列を想定します。新しいサイズ 2n への再割り当てとコピーには 2n ステップのコストがかかりますが、次の n 個の「増加」操作は無料です。
ちなみに、これはstd::vector
他の多くの配列コンテナーが内部的に実装されている方法です。