Maison > développement back-end > Golang > Pourquoi les comparaisons de tableaux de structures vides dans Go donnent-elles parfois des résultats inattendus ?

Pourquoi les comparaisons de tableaux de structures vides dans Go donnent-elles parfois des résultats inattendus ?

DDD
Libérer: 2024-12-21 17:25:11
original
242 Les gens l'ont consulté

Why Do Array Comparisons of Empty Structures in Go Sometimes Yield Unexpected Results?

Pourquoi les comparaisons de tableaux de structures donnent des résultats inégaux

Dans Go, comparer des tableaux de structures vides peut produire des résultats inattendus. Ce comportement découle de la nature subtile des pointeurs et des variables de taille nulle dans le langage.

Pointeurs vers des variables de taille nulle

Selon la spécification Go, les pointeurs vers Les variables distinctes de taille nulle n'ont pas nécessairement des adresses uniques. En effet, les variables de taille nulle peuvent être optimisées par le compilateur, ce qui entraîne une allocation de mémoire imprévisible.

Exemple

Considérez le code suivant :

var s, ss struct{} // two empty structs
arr1 := [6]*struct{}{&s} // array with empty struct pointer
arr2 := [6]*struct{}{&ss} // array with empty struct pointer
fmt.Println(&s == &ss, arr1 == arr2)  // false, true
Copier après la connexion

Dans cet exemple, arr1 et arr2 sont deux tableaux contenant des pointeurs vers des structures vides distinctes, s et ss. Étonnamment, la comparaison arr1 == arr2 renvoie vrai. En effet, le compilateur peut avoir placé s et ss à la même adresse, malgré leurs identités distinctes. Cependant, &s == &ss est évalué à false car il compare directement les pointeurs eux-mêmes.

Variables Int dans les structures

Cependant, lorsque des valeurs non nulles sont stockées dans le structures, telles que des entiers, le comportement de comparaison change.

var l, ll struct{A int}{}
arr3 := [6]*struct{A int}{&l} // array with empty struct pointer
arr4 := [6]*struct{A int}{&ll} // array with empty struct pointer
fmt.Println(&l == &ll, arr3 == arr4)  // false, false
Copier après la connexion

Dans ce cas, la comparaison de arr3 et arr4 renvoie false, indiquant que les tableaux ne sont pas égaux. En effet, les entiers non nuls stockés dans les structures leur donnent des adresses distinctes.

Analyse d'évasion et relocalisation des variables

Le comportement inattendu peut également être influencé par l'analyse d'évasion. , une optimisation du compilateur qui détermine si les variables doivent être allouées sur le tas ou la pile. Si une variable échappe à sa portée locale, elle est allouée sur le tas pour assurer son accessibilité dans d'autres parties du programme.

Dans le cas de pointeurs vers des structures vides, s'ils s'échappent, le compilateur peut les déplacer vers différentes adresses de tas. Cette relocalisation affecte leur comparaison d'égalité, ce qui entraîne faux.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal