Golang での文字列メモリ使用量
値が「A」または「B」のみのマップ[文字列]文字列を使用してコードを最適化する場合" の場合、値の型が小さいため、map[string]bool の方が効率的であると想定されている可能性があります。ただし、テストの結果、両方のマップのメモリ使用量が驚くほど同じであることがわかりました。
unsafe.Sizeof() について
これを調査するには、unsafe.Sizeof() を使用します。メモリ使用量の測定に利用されます。ただし、 unsafe.Sizeof() はデータの「浅い」サイズのみを報告することに注意することが重要です。マップの場合、Go はポインターを使用してマップを実装します。したがって、unsafe.Sizeof(somemap) は、マップのデータ全体ではなく、ポインターのサイズを報告します。
文字列メモリ表現
Go の文字列はヘッダーによって表されます。データへのポインタと長さで構成されます。 Reflect.StringHeader タイプは次の構造を定義します:
したがって、unsafe.Sizeof(somemap) はこのヘッダーのサイズのみを報告し、文字列値とは独立しています。
マップの実際のメモリ要件
マップの実際のメモリ使用量を取得するには、次のようにします。参照するデータを考慮することが重要です。つまり、len(str) int(unsafe.Sizeof(str)) は、より正確な推定値を提供します。
追加の考慮事項
Go ストア UTF-8 の文字列メモリ内のバイト シーケンス。 len() 関数はバイト長を報告するため、文字列の実際のメモリ使用量は次のように概算できます。
また、既存の文字列をスライスすると、そのスライスに新しいバッキング配列が割り当てられることを覚えておくことも重要です。 。元の文字列が参照されなくなった場合でも、バッキング配列はスライスをサポートするためにメモリ内に残ります。
以上がGo で `map[string]string` と `map[string]bool` が同様のメモリ使用量を示すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。