Go에서는 구조체 필드가 선언되는 순서가 구조체 크기에 영향을 줄 수 있습니다. 이유는 무엇입니까?
type A struct { a bool b int64 c int } type B struct { b int64 a bool c int }
이러한 구조체의 크기를 인쇄해 보면 다음과 같은 사실이 드러납니다.
fmt.Println(unsafe.Sizeof(A{})) // Output: 24 fmt.Println(unsafe.Sizeof(B{})) // Output: 16
같은 필드가 있어도 크기가 다릅니다.
필드 정렬 또는 시작 여부 특정 메모리 주소는 대상 아키텍처에 따라 다릅니다. 예를 들어 int64에는 8바이트 정렬이 필요합니다. A에서 첫 번째 필드는 1바이트인 bool입니다. b(int64)를 올바르게 정렬하려면 a 뒤에 7바이트의 암시적 패딩이 있습니다.
B에서는 a 뒤에 int(4바이트)가 있으므로 3바이트의 패딩만 필요합니다. 이는 크기의 차이를 설명합니다.
// Offset (in bytes) for struct A fmt.Println(unsafe.Offsetof(a.a)) // Output: 0 fmt.Println(unsafe.Offsetof(a.b)) // Output: 8 fmt.Println(unsafe.Offsetof(a.c)) // Output: 16 // Offset for struct B fmt.Println(unsafe.Offsetof(b.b)) // Output: 0 fmt.Println(unsafe.Offsetof(b.a)) // Output: 8 fmt.Println(unsafe.Offsetof(b.c)) // Output: 12
type C struct {}
0 크기 구조체의 크기는 0이며, 이는 메모리 할당이 없음을 나타냅니다. 크기가 0인 구조체를 참조하는 개별 변수에도 불구하고 동일한 메모리 주소를 공유할 수 있습니다.
a := C{} b := C{} c := [0]int{} d := [3]C{} fmt.Printf("%p %p %p %p %p", &a, &b, &c, &d, &d[2])
출력:
0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c
모든 주소가 동일하므로 이러한 0에 대한 메모리 할당이 없음을 나타냅니다. -크기 변수.
구조체 필드 순서는 정렬 요구 사항 및 암시적 패딩. 크기가 0인 구조체는 메모리를 할당하지 않고 개별 변수에 대해 동일한 주소를 공유함으로써 메모리 사용을 최적화합니다.
위 내용은 구조체 필드 순서가 Go 구조체의 크기에 영향을 미치는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!