>백엔드 개발 >Golang >Go에서 필드는 동일하지만 순서가 다른 구조체의 크기가 다른 이유는 무엇입니까?

Go에서 필드는 동일하지만 순서가 다른 구조체의 크기가 다른 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-26 03:29:08326검색

Why Do Structs with Identical Fields but Different Orders Have Different Sizes in Go?

필드 순서가 다양한 서로 다른 구조체 크기

제공된 코드에서 필드는 동일하지만 필드 순서가 다른 두 구조체 A와 B는 서로 다른 크기를 보여줍니다. 그 이유는 다음과 같습니다.

암시적 패딩

데이터 유형에 대한 메모리 정렬 요구 사항에 따라 필드 주소는 특정 값의 배수여야 합니다. int64 필드의 경우 이 배수는 8바이트입니다.

구조체 A에서 첫 번째 필드는 1바이트를 사용하는 bool입니다. 후속 int64 필드를 8바이트 경계에 정렬하기 위해 a 뒤에 7바이트의 암시적 패딩이 추가됩니다.

구조체 B에서 첫 번째 필드는 int64 유형의 b입니다. 이미 정렬되었으므로 다음 int 필드를 정렬하려면 a 뒤에 3바이트의 암시적 패딩만 필요하며, 이는 4바이트를 차지합니다.

크기 영향

이 암시적 패딩으로 인해 A는 24바이트입니다(a는 1바이트, b는 8바이트, 패딩은 15바이트). 한편 B는 16바이트(a는 1바이트, 패딩은 3바이트, b는 8바이트, c는 4바이트)입니다.

Zero-Size Structs

구조체 C는 완전히 선언됩니다. 비어 있으므로 크기가 0바이트가 됩니다. Go 언어 사양에 따르면 0보다 큰 필드가 없는 구조의 크기는 0입니다.

주소 지정 가능성 및 메모리 할당

크기가 0인 값의 ​​경우 언어는 동일한 메모리 주소를 허용합니다. 고유한 변수에 재사용됩니다. 이는 := C{}의 경우 시스템이 실제로 메모리를 할당하지 않음을 의미합니다.

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

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