Dans Go, les structures peuvent présenter des tailles différentes lorsque leurs champs sont disposés dans des ordres différents.
type A struct {</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'exécution d'unsafe.Sizeof (A{}), le résultat est de 24 octets, tandis que unsafe.Sizeof(B{}) imprime 16 octets. Bien qu'ils aient le même ensemble de champs, leur ordre différent conduit à cette variation de taille.
Les tailles des structures sont influencées par les contraintes d'alignement. Les valeurs int64 nécessitent un alignement sur des adresses de 8 octets. Dans la structure A, après le champ bool (1 octet), 7 octets de remplissage implicite sont ajoutés pour assurer l'alignement du champ int64 suivant (8 octets). Ceci explique la taille de 24 octets.
Dans la structure B, cependant, seuls 3 octets de remplissage sont nécessaires après le champ bool car le champ int ne fait que 4 octets. Ainsi, la taille globale devient 16 octets.
structure de type C {<br>}<br>
La taille de la structure C est 0, car elle n'a aucun champ d'une taille supérieure à zéro. Cependant, cela n'implique pas nécessairement qu'aucune mémoire n'est allouée pour une instance de type C.
Selon la spécification Go, les valeurs de taille nulle peuvent partager des adresses mémoire. Bien que la spécification suggère d'utiliser la même adresse, ce n'est pas une obligation. Les implémentations Go actuelles utilisent cette optimisation pour conserver la mémoire pour les variables de taille nulle. Par conséquent, même si C a une taille nulle, le système peut toujours allouer de la mémoire pour une variable de type C.
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!