0

便宜上、プレーン テキストの例を使用します。たとえばI have a catmallocstatement のchar場合、最後の\0.

lovelyただし、前に挿入したい場合はどうすればよいcatですか? 十分な大きさの新しい配列を作成し、すべてをコピーする必要があるようです。

さらに悪いことに、どのくらいのものが追加されるかはコンピューターでは予測できないため、新しい文字が追加されるたびにこの re-malloc を実行してコピーする必要があるようです。つまり、文字ごとにすべてを実行する必要がありますl o v e l y。これは賢明な解決策ではありません。(コンピューターは「素敵」という言葉を事前に知りませんよね?)

「より良い」解決策は、最初に十分な大きさの配列を作成して、新しい文字が挿入されるたびに、プログラムがそれ以降のすべてをコピーして移動するだけであるように思われます。ただし、特にドキュメントが長く、最初から追加しているときは、これでもまだ非効率的です。

同じことが「削除」にも当てはまります。文字が削除されるたびに、それ以降のすべてをコピーして配列サイズを縮小する必要があるようです。

コンテンツを格納するために配列の代わりにノードを使用することは、コンテンツの途中で何かをしたいときはいつでも最初からずっと道をたどらなければならないので、同様にひどい解決策のようです.

この場合、メモリを管理するための正しい、または効率的な方法は何ですか? C などの低レベルでのプログラミングに対する回答が必要です。C では、すべてを処理する「魔法の」関数やライブラリを使用せずに直接メモリの割り当てと割り当て解除を行う必要があります。

4

5 に答える 5

0

文字の挿入と削除を何度も再 malloc せずに簡単に処理したい場合は、最適なソリューションはDoubly Linked List だと思います。

ここをチェックしてください: DoublyLinkedListExample (私は学校でそれを学びましたが、このチュートはそれがどのように機能し、どのように使用するかを非常に簡単に説明していると思います)

これらは、データを含む構造体 (ノード)、前の要素へのポインター、および次の要素へのポインターです。それがどのように機能するかを理解していない場合は、単純にリンクされたリストのチュートリアルを前に確認してください.

最初は理解するのがかなり難しいので、練習してください。トレーニングを続ければ、あなたはそれに到達します:)

于 2013-07-26T14:33:48.860 に答える
0

ユースケースを明確にするコメントで回答したことを考えると、コンテンツのリンクされたリストを検討することをお勧めします。プレーンテキストの例のメタファーでは、リンクされたリストの要素は単語、段落、またはページであり、単語自体は連続した配列です。

それらの間のナビゲーションはそれほど高速ではありませんが、パフォーマンスに不可欠なのは、挿入と削除を迅速に行うことであると思われました。小さな連続した単語を持つことで、小さなO(n)ものを制御することで、再割り当て/縮小とコピーのコストが最小限に抑えられnます。nこれは、リンクされたリスト要素であるを多数持つことによって実現されます。

これにより、コンテンツの空間的局所性の「個々の」部分を持つことによるパフォーマンスの向上が組み合わされ、上位レベルのリスト/ツリー構造を選択して、時間的局所性の利点を得ることができます。

これが実際に対処していないことの 1 つは、このデータを処理するために後でこのデータに対して何をする必要があるか、およびどのレベルのパフォーマンスが本当に許容できるかということです。一定の malloc 呼び出しは、ブロッキング システム コールであるため、遅延に悪影響を及ぼします。そのため、循環バッファーや独自のより大きなメモリチャンクの管理など、既に述べた別のソリューションを使用して、これらの要素に自分自身を分散させることをさらに検討できます。そうすれば、操作するためにはるかに大きなメモリのチャンクが必要な場合にのみ malloc する必要があり、ページからページにすべてを再コピーする必要はありませんが、収まらない小さなチャンクだけです。

繰り返しになりますが、私のコメントで述べたように、人々はこの種のことについて論文を書いています。これは、OS の設計とシステムの理解の主要な要素です。したがって、これをすべて一粒の塩で取ってください。ここでは説明しきれないほど多くの考慮事項があります。

于 2013-07-26T15:05:16.237 に答える