Skip to content

Goのmapはboolとstruct{}でメモリ効率の差は小さい

mapchanなどで、空の構造体を扱うときがある。

var (
m map[string]struct{}
c chan struct{}
)

struct{}のサイズは0なので、確かにメモリ効率はboolと比べても良くなるが、Russの発言1によると、もともとmapのバケットを管理するための値も持っているので、64bit環境でも数%の節約にしかならないらしい。

それよりも、boolは2値を持つので、値の意味を考えなくてもよいところが重要かなと思う。

ところでGo 1.24でmap[T]struct{}のメモリ節約効果がなくなったという話もあるが、これは意図したものではなく、SwissTableへの変更でそうなっているだけで、いつかは解決するべき問題という認識らしい。

  1. https://groups.google.com/g/golang-nuts/c/_qilWYJS81Y/m/3ZeqcWoZDwAJ