Maison  >  Article  >  développement back-end  >  Explication détaillée de l'utilisation de l'alignement des octets dans Golang

Explication détaillée de l'utilisation de l'alignement des octets dans Golang

藏色散人
藏色散人avant
2021-09-10 16:42:152320parcourir

Cet article vous est présenté par la colonne didacticielle go language sur l'alignement des octets de Golang. J'espère qu'il sera utile aux amis dans le besoin !

J'ai récemment effectué des travaux d'optimisation des performances. L'une des structures occupe un espace relativement grand, et le nombre dans la mémoire est particulièrement grand. mémorisé En comprenant l'alignement des octets en langage C, vous pouvez économiser beaucoup de mémoire en ajustant simplement l'ordre des champs. Cette idée est également applicable en golang. Taille des données de base

Avant cela, jetons un coup d'œil à la taille de golang. des données occupées par les types de base à l'intérieur
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

tutoriel !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer