Задать вопрос
@calculator212

Сколько занимает в памяти Struct{}{}?

Сколько занимает в памяти хранение такой структуры, если судить по коду снизу, то вообще не занимает, но как такое возможно, ведь где то должно храниться то, что тип данных в мапе это пустая структура.
код отсюда
package main

import (
	"fmt"
	"unsafe"
)

func main() {
	variant1 := make(map[string]bool)
	variant2 := make(map[string]struct{})
	for i := 0; i < 1<<16; i++ {
		key := fmt.Sprintf("%v", i)
		variant1[key] = true
		variant2[key] = struct{}{}
	}
	size1 := unsafe.Sizeof(variant1)
	size2 := unsafe.Sizeof(variant2)
	for k, v := range variant1 {
		size1 += unsafe.Sizeof(k)
		size1 += unsafe.Sizeof(v)
	}
	for k, v := range variant2 {
		size2 += unsafe.Sizeof(k)
		size2 += unsafe.Sizeof(v)
	}
	fmt.Printf("bool variant  : %v bytes\n", size1)
	fmt.Printf("struct variant: %v bytes\n", size2)
	// bool variant  : 1114120 bytes
	// struct variant: 1048584 bytes
	// size1-size2 65536 bytes
}
  • Вопрос задан
  • 2690 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Всё верно, она занимает 0 байт.
Можно проверить:
package main

import (
    "fmt"
    "unsafe"
)

type S1 struct {
    f1 int
}

func main() {
    s1 := S1{}
    s2 := struct{}{}

    fmt.Printf("s1 size: %v\n", unsafe.Sizeof(s1))
    fmt.Printf("s2 size: %v\n", unsafe.Sizeof(s2))
}

Вывод
s1 size: 8
s2 size: 0


Там, где в мапе нужны только ключи - я всегда делаю значение struct{}{}
Ответ написан
не смотря на то что сама структура занимает 0 байт, конечно же есть накладные расходы на ее объявление, хранение указателя, ссылки и т.п. Так что это совсем не 'ничего', но использование struct{} имеет наименьшее потребление памяти https://medium.com/easyread/golang-series-empty-st...

P.S. https://www.reddit.com/r/golang/comments/om990a/ho...
Там есть интересное пояснение как работает empty struct в golang.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы