3

文脈を説明するだけです。これは文字列プールに関するもので、文字列キーを持つハッシュ テーブルを意味します (実際には長さを知っている特別な文字列ですが、この詳細はここでは関係ないと思います)。ポイントは、プールを拡張する必要がある場合に、リストの配列 (テーブル バケットとして使用) のサイズを変更することです。しかし、これはコアの詳細です-文字列を含むセルは、実際にはメモリの隅々に広がるのではなく、セルの配列に含まれています[1]。したがって、リストはもう必要ありません。それらは時代遅れのものです。そう:

  1. callocのようにメモリ領域を「ゼロにする」reallocの変種はありますか? アイテムはポインターだけでなく、リスト ヘッドであるため、ここでそれが必要です。問題は、空のリストが NULL として表示されるようにすることです。それ以外の場合は、最善の解決策ですmemset(p, size, 0);

  2. その場で成長するのに十分なスペースがない場合にコピーせず、代わりに alloc のように割り当てる realloc のバリアントはありますか? ここでの問題は、新しいモジュロに従って文字列をリストに再配布する必要があるため、データが不要になったことです。そうでなければ、最良の選択は何ですか?

    • 再割り当てを使用する
    • (無料 &) 割り当てを使用
    • (無料 &) calloc を使用

いずれにせよ、これは正しいですか: realloc はより多くのスペースをその場で割り当てようとしますが、そうでない場合は別の場所に割り当てて静かにコピーしますか? はいの場合、おそらく問題は、異なるアクションを必要とする (少なくとも) 3 つのユースケース (場所に十分なスペースがある場合とない場合の両方) がありますが、オプションがまったくない単一の関数です。

  • これらのデータ用にもっと多くの場所が必要です (標準)。
  • もっと場所が必要ですが、データはこれからゴミです。
  • より多くのスペースと「ゼロにする」領域が必要です。

私にとって最良の選択肢は何ですか?他にどう思いますか?このトピックに関する詳しい考察や情報はどこで見つけることができますか?

alloc が calloc や realloc とは異なるインターフェイスを持つ理由はありますか? (つまり、合計サイズと単一サイズとカウントを指定することを意味します)

[1] 本来の目的は、順序付けられたセットとマップを作成することでした。文字列プールの場合は必要ありませんが、気にしません。代わりに、コードをより明確にし、参照の局所性を提供します。

4

2 に答える 2

4

Is there a variant of realloc that "zeroes" the memory area like calloc?

No.

Is there a variant of realloc that does not copy if ever there is not enough space to grow on place, but instead just allocates like alloc?

No.

If I were you I'd probably use free and calloc. But ideally you want to design your system so that reallocations are infrequent and so the different performance characteristics of the various options are not significant. In other words, make sure that it doesn't matter which option you select.

于 2012-12-12T17:36:45.307 に答える
1

callocのようにメモリ領域を「ゼロにする」reallocの変種はありますか? アイテムはポインターだけでなく、リスト ヘッドであるため、ここでそれが必要です。問題は、空のリストが NULL として表示されるようにすることです。それ以外の場合は、 memset(p, size, 0); に対する最適なソリューションです。

標準に厳密に準拠してコーディングしている場合は、memset. 少なくともこれは簡単に回避できます。

プラットフォーム固有の余裕がある場合、それらの一部にはrecalloc機能があります。

その場で成長するのに十分なスペースがない場合にコピーせず、代わりに alloc のように割り当てる realloc のバリアントはありますか? ここでの問題は、新しいモジュロに従って文字列をリストに再配布する必要があるため、データがもう必要ないことです。そうでなければ、最良の選択は何ですか?

繰り返しますが、残念ながらありません。

これらの機能の両方を (特に) 追加する C1Xの提案がありますが、今のところ、reallocの現在の動作に固執しています。

于 2012-12-12T19:27:06.913 に答える