- slice 유형은 24바이트를 차지하며 내부적으로 데이터에 대한 포인터를 포함합니다. 포인터(8바이트)와 int의 길이(8바이트)와 int의 용량(8바이트)
- 맵 유형은 8바이트를 차지하고 맵 구조에 대한 포인터입니다.
- Can 빈 유형을 나타내려면 struct{}를 사용하세요. 공간을 차지하지 않습니다. 이를 맵의 값으로 사용합니다. 맵을 세트로 사용할 수 있습니다
- 바이트 정렬
- 구조체의 필드는 메모리에 촘촘하게 정렬되지 않고 바이트 단위로 정렬됩니다. , int가 8바이트를 차지하면 8의 배수인 주소에만 쓸 수 있습니다. 바이트 정렬이 필요한 이유는 주로 효율성을 고려하기 위한 것이며 더 깊이 인터넷에서 이론을 읽었으며 그다지 신뢰할만하지 않다고 느껴지므로 헛소리는 하지 않겠습니다. 관심이 있으시면 직접 공부해 보세요.
// |x---| So(unsafe.Sizeof(struct { i8 int8 }{}), ShouldEqual, 1)
이 두 구조의 내용은 정확히 동일합니다. 필드 순서가 조정되어 공간이 33% 절약되었습니다.
// |x---|xxxx|xx--| So(unsafe.Sizeof(struct { i8 int8 i32 int32 i16 int16 }{}), ShouldEqual, 12) // |x-xx|xxxx| So(unsafe.Sizeof(struct { i8 int8 i16 int16 i32 int32 }{}), ShouldEqual, 8)
여기서 int64는 8의 배수인 주소에만 나타날 수 있습니다. , 그래서 첫 번째 구조에서 연속된 4바이트가 비어있습니다
// |x---|xxxx|xx--|----|xxxx|xxxx| So(unsafe.Sizeof(struct { i8 int8 i32 int32 i16 int16 i64 int64 }{}), ShouldEqual, 24) // |x-xx|xxxx|xxxx|xxxx| So(unsafe.Sizeof(struct { i8 int8 i16 int16 i32 int32 i64 int64 }{}), ShouldEqual, 16)
타입 이름을 바꾼 후에도 타입의 크기는 변하지 않았습니다
더 많은 golang 관련 지식은
golang
튜토리얼 칼럼을 방문해 주세요!