Это дает в общей сложности 40 + 8 = 48 байтов (64-битная архитектура)

вая распределение карт, где начальныйпространство не указан, например:

foo := make(map[string]int)

документация предполагает, что распределение памяти здесь зависит от реализации. Так (как) я могу сказать, сколько памяти моя реализация выделяет для этой карты?

Ответы на вопрос(2)

источник типа карты Go, вы увидите, что карта состоит из заголовка (типhmap) и массив блоков (типbmap). Когда вы создаете новую карту и не указываете начальное пространство (hint), создается только одно ведро.

Заголовок состоит из нескольких полей:

1 *int,
2 *uint8,
1 *uint16,
1 *uint32,
2 *unsafe.Pointer,
1 *uintptr.

Размер типовint, uintptr, а такжеunsafe.Pointer равен размеру слова (8 байт на 64-битных машинах).

Ведро состоит из массива 8 *uint8.

Это дает в общей сложности 40 + 8 = 48 байтов (64-битная архитектура)

а произвольных сложных структур данных. Это подробно в этом ответе:Как получить переменный объем памяти переменной в Голанге?

Чтобы измерить размер карты, созданнойmake(map[string]int)используйте следующую контрольную функцию:

var x map[string]int

func BenchmarkEmptyMap(b *testing.B) {
    for i := 0; i < b.N; i++ {
        x = make(map[string]int)
    }
}

Выполнение с

go test -bench . -benchmem

Результат:

BenchmarkEmptyMap-4     20000000   110 ns/op      48 B/op    1 allocs/op

Ответ на мою 64-битную архитектуру:48 байтов.

Как уже указывалось, размер может зависеть от архитектуры. Также размер может зависеть от начальной емкости, которую вы можете передатьmake(), как вы можете видеть в этом примере:

func BenchmarkEmptyMapCap100(b *testing.B) {
    for i := 0; i < b.N; i++ {
        x = make(map[string]int, 100)
    }
}

Выход:

BenchmarkEmptyMapCap100-4   1000000    1783 ns/op   4176 B/op    3 allocs/op

Карта типаmap[string]int с начальной емкостью 100 теперь требуется 4176 байт (на 64-битной арке).

Начальная емкость по умолчанию составляет около 7, если не указано явно.

Ваш ответ на вопрос