Maison >développement back-end >Golang >Pourquoi l'ordre des champs Struct affecte-t-il la taille des structures Go ?

Pourquoi l'ordre des champs Struct affecte-t-il la taille des structures Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 03:39:09370parcourir

Why Does Struct Field Order Affect the Size of Go Structs?

Ordre structurel différent des champs ayant un impact sur la taille

Dans Go, l'ordre dans lequel les champs de structure sont déclarés peut affecter la taille de la structure. Pourquoi ?

Étude de cas

type A struct {
    a bool
    b int64
    c int
}

type B struct {
    b int64
    a bool
    c int
}

L'impression des tailles de ces structures révèle :

fmt.Println(unsafe.Sizeof(A{})) // Output: 24

fmt.Println(unsafe.Sizeof(B{})) // Output: 16

Même si elles ont les mêmes champs, leurs tailles diffèrent.

Alignement et remplissage des champs

Le fait que les champs soient alignés ou commencent à des adresses mémoire spécifiques dépend de la architecture cible. Par exemple, int64 nécessite un alignement sur 8 octets. Dans A, le premier champ est bool, soit 1 octet. Pour aligner b (int64) correctement, il y a un remplissage implicite de 7 octets après a.

Dans B, puisque a est suivi de int (4 octets), seuls 3 octets de remplissage sont nécessaires. Cela explique la différence de tailles.

// Offset (in bytes) for struct A
fmt.Println(unsafe.Offsetof(a.a)) // Output: 0
fmt.Println(unsafe.Offsetof(a.b)) // Output: 8
fmt.Println(unsafe.Offsetof(a.c)) // Output: 16

// Offset for struct B
fmt.Println(unsafe.Offsetof(b.b)) // Output: 0
fmt.Println(unsafe.Offsetof(b.a)) // Output: 8
fmt.Println(unsafe.Offsetof(b.c)) // Output: 12

Structs et variables de taille nulle

type C struct {}

La taille d'une structure de taille nulle est nulle, ce qui indique qu'il n'y a pas d'allocation de mémoire. Malgré des variables distinctes faisant référence à des structures de taille nulle, elles peuvent partager la même adresse mémoire :

a := C{}
b := C{}
c := [0]int{}
d := [3]C{}

fmt.Printf("%p %p %p %p %p", &a, &b, &c, &d, &d[2])

Sortie :

0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c

Toutes les adresses sont identiques, ce qui indique qu'il n'y a aucune allocation de mémoire pour ces structures nulles. -size variables.

Conclusion

L'ordre des champs de structure peut avoir un impact sur la taille en raison des exigences d'alignement et du remplissage implicite. Les structures de taille nulle optimisent l'utilisation de la mémoire en n'allouant aucune mémoire et en partageant potentiellement la même adresse pour des variables distinctes.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn