Maison >développement back-end >Golang >Pourquoi les structures Go ont-elles des tailles différentes en fonction de l'ordre des champs ?

Pourquoi les structures Go ont-elles des tailles différentes en fonction de l'ordre des champs ?

DDD
DDDoriginal
2024-12-08 14:20:15905parcourir

Why Do Go Structs Have Different Sizes Depending on Field Order?

Écart de taille de structure avec la réorganisation des champs

Dans Go, les structures peuvent présenter des tailles différentes lorsque leurs champs sont disposés dans des ordres différents.

Problème 1 : Tailles de structure erronées

type A struct {</p>
<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.

Explication : remplissage implicite

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.

Problème 2 : Structure C de taille nulle

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.

Explication : optimisation de l'implémentation

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!

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