>백엔드 개발 >Golang >동일한 필드를 가진 Go 구조체의 크기가 다른 이유는 무엇입니까?

동일한 필드를 가진 Go 구조체의 크기가 다른 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-18 16:18:10752검색

Why Do Go Structs with the Same Fields Have Different Sizes?

구조체 필드 순서 및 크기

제공된 코드는 흥미로운 동작을 보여줍니다.

<br>A형 구조체 {</p>
<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?

0 크기 값

Go 사양에 따르면 크기가 0보다 큰 필드나 요소가 없는 구조체나 배열의 크기는 다음과 같습니다. 영. 이는 또한 두 개의 서로 다른 크기가 0인 변수가 동일한 메모리 주소를 공유할 수 있음을 의미합니다. 이는 크기가 0이고 실제 메모리를 차지하지 않을 수 있는 C{}의 경우입니다. 대신 struct{}{}, []int{} 또는 심지어 빈 배열 [3]struct{}{}와 같은 크기가 0인 다른 값과 동일한 메모리 주소를 참조할 수 있습니다.

결론

필드 정렬과 0 크기 값의 개념을 이해하면 Go의 메모리 관리에 대한 이해가 향상됩니다. 구조체 내에서 필드를 전략적으로 배열함으로써 메모리 할당을 최적화하고 효율적인 데이터 조작을 보장할 수 있습니다.

위 내용은 동일한 필드를 가진 Go 구조체의 크기가 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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