値を "A" または "B" に制限した map[string]string を利用するコードを最適化する場合、次のように仮定するかもしれません。値のサイズが小さいため、map[string]bool の方が効率的です。ただし、テストしたところ、両方のマップのメモリ使用量が変化していないことが観察されました。
Go では、文字列は連続したバイトとしてメモリに格納されるのではなく、実際のデータとその長さへのポインタを含むヘッダとして格納されます。変数のサイズを決定するために使用される unsafe.Sizeof() 関数は、このヘッダーのサイズのみを取得します。このヘッダーのサイズは、文字列の長さに関係なく一定のままです。
同様に, Go のマップはポインターとして実装されており、unsafe.Sizeof() はマップの内容ではなくポインターのサイズを報告します。したがって、map[string]string と map[string]bool の両方で報告されるメモリ使用量は、それぞれのポインタのサイズのみを反映します。
実際のメモリを計算するにはマップを消費する場合は、キーと値のペアや割り当てられたメモリなど、その基礎となるデータ構造のサイズを考慮する必要があります。文字列の場合、メモリ要件はバイト長とヘッダー サイズの合計として推定できます。ただし、文字列がスライスまたは変更された場合でも、基になるバッキング配列がメモリ内に保持される可能性があることに注意することが重要です。
Go では、unsafe.Sizeof()関数は、特にマップや文字列などのデータ構造について、メモリ使用量の包括的な表現を提供しません。メモリ消費を最適化する場合、データ構造とその内容の実際のメモリ要件を考慮することが重要です。
以上がGo の `unsafe.Sizeof()` が文字列を含むマップの実際のメモリ使用量を反映しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。