文脈を説明するだけです。これは文字列プールに関するもので、文字列キーを持つハッシュ テーブルを意味します (実際には長さを知っている特別な文字列ですが、この詳細はここでは関係ないと思います)。ポイントは、プールを拡張する必要がある場合に、リストの配列 (テーブル バケットとして使用) のサイズを変更することです。しかし、これはコアの詳細です-文字列を含むセルは、実際にはメモリの隅々に広がるのではなく、セルの配列に含まれています[1]。したがって、リストはもう必要ありません。それらは時代遅れのものです。そう:
callocのようにメモリ領域を「ゼロにする」reallocの変種はありますか? アイテムはポインターだけでなく、リスト ヘッドであるため、ここでそれが必要です。問題は、空のリストが NULL として表示されるようにすることです。それ以外の場合は、最善の解決策です
memset(p, size, 0);
その場で成長するのに十分なスペースがない場合にコピーせず、代わりに alloc のように割り当てる realloc のバリアントはありますか? ここでの問題は、新しいモジュロに従って文字列をリストに再配布する必要があるため、データが不要になったことです。そうでなければ、最良の選択は何ですか?
- 再割り当てを使用する
- (無料 &) 割り当てを使用
- (無料 &) calloc を使用
いずれにせよ、これは正しいですか: realloc はより多くのスペースをその場で割り当てようとしますが、そうでない場合は別の場所に割り当てて静かにコピーしますか? はいの場合、おそらく問題は、異なるアクションを必要とする (少なくとも) 3 つのユースケース (場所に十分なスペースがある場合とない場合の両方) がありますが、オプションがまったくない単一の関数です。
- これらのデータ用にもっと多くの場所が必要です (標準)。
- もっと場所が必要ですが、データはこれからゴミです。
- より多くのスペースと「ゼロにする」領域が必要です。
私にとって最良の選択肢は何ですか?他にどう思いますか?このトピックに関する詳しい考察や情報はどこで見つけることができますか?
alloc が calloc や realloc とは異なるインターフェイスを持つ理由はありますか? (つまり、合計サイズと単一サイズとカウントを指定することを意味します)
[1] 本来の目的は、順序付けられたセットとマップを作成することでした。文字列プールの場合は必要ありませんが、気にしません。代わりに、コードをより明確にし、参照の局所性を提供します。