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