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
}
structure de type B {
b int64 a bool c int
}
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 ?
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 ?
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{}{}.
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!