제공된 코드는 흥미로운 동작을 보여줍니다.
<br>A형 구조체 {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">a bool b int64 c int
}
type B struct {
b int64 a bool c int
}
A{} 및 B{}는 unsafe.Sizeof를 사용하여 놀라운 결과를 얻습니다. 결과:
<br>fmt.Println(unsafe.Sizeof(A{})) // 출력: 24<br>fmt.Println(unsafe.Sizeof(B{})) / / 출력: 16<br>
왜 이 구조체는 크기가 다른가요? 같은 필드인가요?
답은 필드 정렬에 있습니다. Go에서는 변수 주소를 유형에 따라 정렬해야 하며, 이 정렬은 int64(8바이트 정렬)와 같은 유형에 특히 중요합니다. A의 경우 첫 번째 필드 a는 bool이므로 1바이트의 저장 공간만 필요합니다. 이 필드 뒤에는 8바이트 경계에 다음 필드 b(int64 유형)를 정렬하기 위한 7바이트 암시적 패딩이 있습니다. 하지만 B의 경우 첫 번째 필드 b가 이미 8바이트 경계에 정렬되어 있으므로 암시적 패딩이 필요하지 않아 구조체 크기가 16바이트로 작아집니다.
< h3>빈 구조체의 크기
계속해서 또 다른 흥미로운 것을 발견합니다. 사례:
<br>type C struct {<br>}<br>
unsafe.Sizeof(C{})를 인쇄할 때 예기치 않게 0의 출력을 얻습니다. 모든 구조체가 일부를 점유한다는 점을 고려하면 이것이 어떻게 가능합니까? memory?
Go 사양에 따르면 크기가 0보다 큰 필드나 요소가 없는 구조체나 배열의 크기는 다음과 같습니다. 영. 이는 또한 두 개의 서로 다른 크기가 0인 변수가 동일한 메모리 주소를 공유할 수 있음을 의미합니다. 이는 크기가 0이고 실제 메모리를 차지하지 않을 수 있는 C{}의 경우입니다. 대신 struct{}{}, []int{} 또는 심지어 빈 배열 [3]struct{}{}와 같은 크기가 0인 다른 값과 동일한 메모리 주소를 참조할 수 있습니다.
필드 정렬과 0 크기 값의 개념을 이해하면 Go의 메모리 관리에 대한 이해가 향상됩니다. 구조체 내에서 필드를 전략적으로 배열함으로써 메모리 할당을 최적화하고 효율적인 데이터 조작을 보장할 수 있습니다.
위 내용은 동일한 필드를 가진 Go 구조체의 크기가 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!