Go에서 다양한 크기의 슬라이스를 만들려고 할 때 메모리 할당 문제가 발생했습니다. 이러한 제한의 이유를 더 자세히 살펴보겠습니다.
Go 문서에 따르면 슬라이스 요소의 인덱스 값은 0부터 len(s)-1까지이며, 이는 슬라이스의 최대 용량이 다음과 같이 결정됨을 나타냅니다. 대상 빌드의 기본 정수 크기입니다.
소스 코드를 조사한 결과 특정 크기의 슬라이스 생성을 보장하는 안전 검사를 발견했습니다. 가능함:
if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) { panic(errorString("makeslice: len out of range")) }
귀하의 경우 uintptr(len) > maxmem/uintptr(t.elem.size)가 true가 되어 요청된 할당이 금지됩니다. 이는 슬라이스에 필요한 메모리가 최대 메모리 제한을 초과하기 때문입니다.
그러나 메모리를 소비하지 않는 빈 구조체의 슬라이스를 할당하면 동일한 할당 크기가 허용됩니다.
r := make([]struct{}, math.MaxInt64)
빈 구조체는 메모리를 소비하지 않기 때문에 메모리 요구 사항을 평가하는 조건이 거짓이 되기 때문입니다. Go를 사용하면 이러한 유형에 대해 매우 큰 용량의 슬라이스를 생성할 수 있습니다.
위 내용은 Go 슬라이스의 최대 크기를 제한하는 것은 무엇이며 빈 구조체가 차이를 만드는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!