Maison > développement back-end > Golang > Pourquoi les structures Go avec les mêmes champs ont-elles des tailles différentes ?

Pourquoi les structures Go avec les mêmes champs ont-elles des tailles différentes ?

Linda Hamilton
Libérer: 2024-12-18 16:18:10
original
751 Les gens l'ont consulté

Why Do Go Structs with the Same Fields Have Different Sizes?

Ordre et taille des champs de structure

Le code fourni démontre un comportement intrigant :

<br>tapez une structure {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">a bool
b int64
c int
Copier après la connexion

}

structure de type B {

b int64
a bool
c int
Copier après la connexion

}

Lors de l'impression des tailles de A{} et B{} en utilisant unsafe.Sizeof, nous obtenons des résultats surprenants résultats :

<br>fmt.Println(unsafe.Sizeof(A{})) // Sortie : 24<br>fmt.Println(unsafe.Sizeof(B{})) / / Sortie : 16<br>

Pourquoi ces structures ont-elles des tailles différentes malgré le fait d'avoir les mêmes champs ?

Alignement des champs

La réponse réside dans l'alignement des champs. Dans Go, les adresses des variables doivent être alignées en fonction de leur type, et cet alignement est particulièrement important pour les types comme int64 (alignement sur 8 octets). Dans le cas de A, le premier champ a est un booléen, qui ne nécessite que 1 octet de stockage. Après ce champ, il y a un remplissage implicite de 7 octets pour aligner le champ b suivant (de type int64) sur une limite de 8 octets. Cependant, dans le cas de B, puisque le premier champ b est déjà aligné sur une limite de 8 octets, aucun remplissage implicite n'est nécessaire, ce qui entraîne une taille de structure plus petite de 16 octets.

< h3>Taille d'une structure vide

En continuant, nous rencontrons un autre intéressant case :

<br>type C struct {<br>}<br>

Lors de l'impression d'unsafe.Sizeof(C{}), nous avons inopinément obtenir une sortie de 0. Comment est-ce possible, étant donné que chaque structure occupe une certaine mémoire ?

Valeurs de taille nulle

La spécification Go indique qu'une structure ou un tableau sans champs ni éléments d'une taille supérieure à zéro a une taille de zéro. Cela implique également que deux variables distinctes de taille nulle peuvent partager la même adresse mémoire. C'est le cas de C{}, qui a une taille nulle et ne peut occuper aucune mémoire réelle. Au lieu de cela, il peut référencer la même adresse mémoire que d'autres valeurs de taille nulle, telles que struct{}{}, []int{} ou même le tableau vide [3]struct{}{}.

Conclusion

Comprendre l'alignement des champs et le concept de valeurs de taille nulle améliore notre compréhension de la gestion de la mémoire de Go. En organisant les champs de manière stratégique au sein d'une structure, nous pouvons optimiser l'allocation de mémoire et garantir une manipulation efficace des données.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal