Heim >Backend-Entwicklung >Golang >Warum führen Vergleiche von Arrays von Zeigern auf leere Strukturen zu inkonsistenten Ergebnissen?

Warum führen Vergleiche von Arrays von Zeigern auf leere Strukturen zu inkonsistenten Ergebnissen?

Susan Sarandon
Susan SarandonOriginal
2024-12-28 20:59:16733Durchsuche

Why Do Comparisons of Arrays of Pointers to Empty Structs Produce Inconsistent Results?

Warum ein Array-Vergleich mit leeren Strukturen zu unterschiedlichen Ergebnissen führt

Warum führt der Gleichheitsvergleich der Arrays zu einem gegebenen Array von Zeigern auf leere Strukturen? manchmal als wahr und manchmal als falsch bewerten?

Erforschung von Verhalten

package main

import "fmt"

type myStruct struct{}

func main() {
    s, ss := myStruct{}, myStruct{}
    arr1 := [6]*myStruct{&s}
    arr2 := [6]*myStruct{&ss}
    fmt.Println(&s == &ss, arr1 == arr2)  // Produces mixed results (e.g., false, true or true, false)

    l, ll := myStruct{A: 1}, myStruct{A: 1}
    arr3 := [6]*myStruct{&l}
    arr4 := [6]*myStruct{&ll}
    fmt.Println(&l == &ll, arr3 == arr4)  // Always evaluates to false
}

Erklärung

Die Go-Sprachspezifikation besagt, dass:

  • Zeiger auf verschiedene Variablen der Größe Null können oder möglicherweise nicht gleich.
  • Eine Struktur oder ein Array hat die Größe Null, wenn es keine Felder mit einer Größe ungleich Null enthält (oder Elemente).
  • Zwei unterschiedliche Variablen der Größe Null können dieselbe Adresse im Speicher haben.

Dynamisches Verhalten und Escape-Analyse

Das Verhalten lässt sich erklären, indem man die vom Go-Compiler durchgeführte Escape-Analyse berücksichtigt.

  • Im ersten Beispiel die Variablen s und ss entkommen nicht (d. h. sie werden nicht als Referenz an andere Funktionen übergeben). Dies bedeutet, dass der Compiler mehr Flexibilität bei der Zuweisung im Speicher hat und ihnen möglicherweise dieselbe Adresse zuweisen kann.
  • Im zweiten Beispiel führt das Hinzufügen eines fmt.Printf-Aufrufs (der sowohl s als auch ss maskiert) dazu, dass der Compiler verschoben wird die Variablen auf den Heap, was zu unterschiedlichen Speicheradressen führt und somit false für &l == ergibt &ll.

Auswirkungen

  • Es ist nicht zuverlässig, Arrays leerer Strukturen auf Gleichheit basierend auf der Gleichheit ihrer Zeiger zu vergleichen.
  • Escape-Analysen können das Verhalten solcher Vergleiche erheblich beeinflussen.

Das obige ist der detaillierte Inhalt vonWarum führen Vergleiche von Arrays von Zeigern auf leere Strukturen zu inkonsistenten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn