1

申し訳ありませんが、これまでに質問されたことがありますが、探しているものを見つけることができませんでした。

リストからフィールドを読み取り、それらをメモリのブロックに書き込んでいます。私はできた

  • リスト全体を歩き、必要な合計サイズを見つけ、1つ実行してmallocから、リストをもう一度歩き、各フィールドをコピーします。
  • realloc値を書き込むときに、リスト全体とメモリのブロックをウォークします。

今のところ、最初のものが私にとって最も効率的だと思われます(呼び出しの数が最も少ない)。どちらのアプローチの長所と短所は何ですか?

お時間をいただきありがとうございます。

4

3 に答える 3

2

ほとんどの場合、最初のアプローチの方が優れています。realloc()は通常、メモリブロックの内容全体を新しく割り当てられたより大きなブロックにコピーすることで機能します。したがって、 n個のreallocはn個のコピーを意味し、それぞれが最後のコピーよりも大きくなります。(毎回割り当てにmバイトを追加する場合、最初のreallocはmバイトをコピーする必要があり、次の1つは2m、次の3m、...)。

衒学的な答えは、realloc()の内部パフォーマンスへの影響は実装固有であり、標準で明示的に定義されていないということです。一部の実装では、バイトを瞬時に移動する魔法の妖精などによって機能する可能性がありますが、現実的な実装では、realloc()はコピーを意味します。

于 2010-10-24T12:14:21.950 に答える
1

最も可能性の高い最大値に基づいて、最初は適切な量のスペースを割り当てる方がよいでしょう。

次に、より多くのスペースが必要な場合は、余分なスペースを割り当てるだけでなく、大きなチャンクを余分に割り当てます。

これにより、リストを1回だけ処理しながら、再割り当ての数を最小限に抑えることができます。

例として、最初に100Kを割り当てます。その後、さらに必要な場合は、101Kしか必要ない場合でも、200Kに再割り当てします。

于 2010-10-24T12:13:30.033 に答える
0

車輪の再発明をせず、darraypaxdiabloが説明したのと同様のアプローチを実装するCCANを使用してください。GitHubでdarrayを参照してください

于 2012-06-13T08:14:34.580 に答える