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
Libérer: 2024-12-08 14:20:15
original
907 Les gens l'ont consulté

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>
<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'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!

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
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