>백엔드 개발 >Golang >빈 구조체에 대한 포인터 배열의 비교가 일관되지 않은 결과를 생성하는 이유는 무엇입니까?

빈 구조체에 대한 포인터 배열의 비교가 일관되지 않은 결과를 생성하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-28 20:59:16739검색

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

빈 구조체를 사용한 배열 비교가 다른 결과를 나타내는 이유

빈 구조체에 대한 포인터 배열이 주어지면 배열의 동등 비교가 수행되는 이유 때로는 true로 평가되고 때로는 true로 평가됩니다. false?

행동 탐색

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
}

설명

Go 언어 사양에는 다음과 같이 명시되어 있습니다.

  • 고유한 크기가 0인 변수에 대한 포인터는 다를 수도 있고 그렇지 않을 수도 있습니다. 동일합니다.
  • 크기가 0이 아닌 필드(또는 요소)가 포함되지 않은 경우 구조체 또는 배열의 크기는 0입니다.
  • 두 개의 개별 크기가 0인 변수는 메모리에서 동일한 주소를 가질 수 있습니다.

동적행동 및 탈출분석

Go 컴파일러가 수행하는 이스케이프 분석을 고려하여 동작을 설명할 수 있습니다.

  • 첫 번째 예에서 변수 s 및 ss는 이스케이프되지 않습니다(즉, 다른 함수에 대한 참조로 전달되지 않습니다). . 이는 컴파일러가 이를 메모리에 더 유연하게 할당하고 동일한 주소를 할당할 수 있음을 의미합니다.
  • 두 번째 예에서 fmt.Printf 호출(s와 ss를 모두 이스케이프하는)을 추가하면 컴파일러가 이동하게 됩니다. 변수를 힙에 추가하여 다른 메모리 주소를 생성하고 &l ==에 대해 false를 생성합니다. &ll.

의미

  • 포인터의 동일성을 기반으로 빈 구조체 배열의 동일성을 비교하는 것은 신뢰할 수 없습니다.
  • 탈출 분석은 이러한 비교 동작에 큰 영향을 미칠 수 있습니다.

위 내용은 빈 구조체에 대한 포인터 배열의 비교가 일관되지 않은 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.