いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-648 (Go 1.24以降ではmap[key]boolとmap[key]struct{}のメモリ使用量は実質同じ?)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

以下の記事を見つけました。

rushter.com

Go 1.24以降は新しいmapの実装方法として Swiss Table が採用されていますが

この採用以降、内部のmap実装が変化したため、以前では安いと考えれていた

map[key]struct{}

が実質的に

map[key]bool

と変わらないメモリ使用量になっているという内容です。構造体のアライメントのためのパディングが関係しています。

If the last field of a struct is zero, Go compiler makes its size 1 byte so that the field can be actually referred in memory by pointer arithmetic without violating memory access (out of bounds reads).

最後のフィールドがゼロサイズの場合、Go コンパイラはそのフィールドをポインタ演算で参照できるように、 1 バイトのサイズを設定するとのことなので

type struct { key int, elem struct{} }type struct { key int, elem bool } も結局 (8 + (1+7)) で同じ16バイトになるということですね。

GoにはSetが無いので、良く map[key]struct{} で表現することが多いと思います。

Go 1.24 以降の場合は、map[key]boolでもメモリ使用量同じなので、map[key]boolの方が分かりやすくて良いかもしれませんね。 (因みに私は map[key]bool を使う派です)

恐らく、そのうち修正されて、以前と同じように map[key]struct{} の方が安い形に戻ると思いますが、今はこうなっているという認識はメモメモ。。。

参考情報

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。