So(unsafe.Sizeof(true), ShouldEqual, 1) So(unsafe.Sizeof(int8(0)), ShouldEqual, 1) So(unsafe.Sizeof(int16(0)), ShouldEqual, 2) So(unsafe.Sizeof(int32(0)), ShouldEqual, 4) So(unsafe.Sizeof(int64(0)), ShouldEqual, 8) So(unsafe.Sizeof(int(0)), ShouldEqual, 8) So(unsafe.Sizeof(float32(0)), ShouldEqual, 4) So(unsafe.Sizeof(float64(0)), ShouldEqual, 8) So(unsafe.Sizeof(""), ShouldEqual, 16) So(unsafe.Sizeof("hello world"), ShouldEqual, 16) So(unsafe.Sizeof([]int{}), ShouldEqual, 24) So(unsafe.Sizeof([]int{1, 2, 3}), ShouldEqual, 24) So(unsafe.Sizeof([3]int{1, 2, 3}), ShouldEqual, 24) So(unsafe.Sizeof(map[string]string{}), ShouldEqual, 8) So(unsafe.Sizeof(map[string]string{"1": "one", "2": "two"}), ShouldEqual, 8) So(unsafe.Sizeof(struct{}{}), ShouldEqual, 0)Bien que le type booléen n'ait qu'un seul bit, il doit également occuper 1 octet, car l'ordinateur est une machine basée sur les octets 64, et un int occupe 8 mots Section
- Le type string occupe 16 octets, contient en interne un pointeur vers data (8 octets) et la longueur d'un int (8 octets)
- Le type slice occupe 24 octets, contient en interne un pointeur vers data Le pointeur (8 octets) et le longueur d'un int (8 octets) et capacité d'un int (8 octets)
- Le type de carte occupe 8 octets et est un pointeur vers la structure de la carte
- Peut utiliser struct{} pour représenter un type vide. n'occupe aucun espace. Utilisez-le comme valeur de la carte. Vous pouvez utiliser la carte comme un ensemble
- Alignement des octets
- Les champs de la structure ne sont pas disposés de manière compacte dans la mémoire, mais sont alignés par octets. , si int occupe 8 octets, alors il ne peut être écrit qu'à une adresse multiple de 8. Quant à savoir pourquoi l'alignement des octets est requis, c'est principalement pour des raisons d'efficacité, et plus profondément, j'ai lu la théorie sur Internet, mais je Je pense que ce n'est pas très fiable, donc je ne dirai pas de bêtises. Si vous êtes intéressé, vous pouvez l'étudier vous-même
// |x---| So(unsafe.Sizeof(struct { i8 int8 }{}), ShouldEqual, 1)
Encapsulez simplement une structure int8, qui est la même que int8, n'occupe que 1 octet et n'a pas d'extra. space.
// |x---|xxxx|xx--| So(unsafe.Sizeof(struct { i8 int8 i32 int32 i16 int16 }{}), ShouldEqual, 12) // |x-xx|xxxx| So(unsafe.Sizeof(struct { i8 int8 i16 int16 i32 int32 }{}), ShouldEqual, 8)
Le contenu de ces deux structures est exactement le même. L'ordre des champs a été ajusté, économisant 33% de l'espace
// |x---|xxxx|xx--|----|xxxx|xxxx| So(unsafe.Sizeof(struct { i8 int8 i32 int32 i16 int16 i64 int64 }{}), ShouldEqual, 24) // |x-xx|xxxx|xxxx|xxxx| So(unsafe.Sizeof(struct { i8 int8 i16 int16 i32 int32 i64 int64 }{}), ShouldEqual, 16)
Il convient de noter ici que int64 ne peut apparaître qu'à des adresses multiples de 8. , donc le premier Dans la structure, 4 octets consécutifs sont vides
type I8 int8 type I16 int16 type I32 int32 So(unsafe.Sizeof(struct { i8 I8 i16 I16 i32 I32 }{}), ShouldEqual, 8)
Après avoir renommé le type, la taille du type n'a pas changé
Pour plus de connaissances sur Golang, veuillez visiter la colonne
golang