Rumah >pembangunan bahagian belakang >Golang >Mengapa Perbandingan Tatasusunan Penunjuk dengan Struktur Kosong Menghasilkan Keputusan yang Tidak Konsisten?

Mengapa Perbandingan Tatasusunan Penunjuk dengan Struktur Kosong Menghasilkan Keputusan yang Tidak Konsisten?

Susan Sarandon
Susan Sarandonasal
2024-12-28 20:59:16742semak imbas

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

Mengapa Perbandingan Tatasusunan dengan Struktur Kosong Menghasilkan Keputusan Berbeza

Memandangkan tatasusunan penunjuk kepada struct kosong, mengapa perbandingan kesamaan tatasusunan kadangkala menilai kepada benar dan kadangkala kepada palsu?

Penerokaan Gelagat

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
}

Penjelasan

Spesifikasi bahasa Go menyatakan bahawa:

  • Penunjuk kepada pembolehubah saiz sifar yang berbeza mungkin atau mungkin tidak sama.
  • Struktur atau tatasusunan mempunyai saiz sifar jika ia tidak mengandungi medan bukan saiz sifar (atau elemen).
  • Dua pembolehubah saiz sifar yang berbeza mungkin mempunyai alamat yang sama dalam ingatan.

Analisis Tingkah Laku dan Melarikan Diri Dinamik

Tingkah laku boleh dijelaskan dengan mempertimbangkan analisis melarikan diri yang dilakukan oleh Go pengkompil.

  • Dalam contoh pertama, pembolehubah s dan ss tidak terlepas (iaitu, ia tidak diluluskan dengan merujuk kepada fungsi lain). Ini bermakna pengkompil mempunyai lebih fleksibiliti dalam memperuntukkannya dalam ingatan dan mungkin memberikan mereka alamat yang sama.
  • Dalam contoh kedua, menambah panggilan fmt.Printf (yang terlepas dari kedua-dua s dan ss) menyebabkan pengkompil bergerak pembolehubah kepada timbunan, menghasilkan alamat memori yang berbeza dan dengan itu menghasilkan palsu untuk &l == &ll.

Implikasi

  • Adalah tidak boleh dipercayai untuk membandingkan tatasusunan struct kosong untuk kesamaan berdasarkan kesamaan penunjuknya.
  • Analisis melarikan diri boleh memberi kesan ketara kepada tingkah laku perbandingan sedemikian.

Atas ialah kandungan terperinci Mengapa Perbandingan Tatasusunan Penunjuk dengan Struktur Kosong Menghasilkan Keputusan yang Tidak Konsisten?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn