Maison > développement back-end > Golang > Qu'est-ce qui limite la taille maximale d'une Go Slice et pourquoi les structures vides font-elles une différence ?

Qu'est-ce qui limite la taille maximale d'une Go Slice et pourquoi les structures vides font-elles une différence ?

Susan Sarandon
Libérer: 2024-12-12 14:48:12
original
192 Les gens l'ont consulté

What Limits the Maximum Size of a Go Slice, and Why Do Empty Structs Make a Difference?

Longueur maximale d'une tranche dans Go

Vous avez rencontré des problèmes d'allocation de mémoire en essayant de créer des tranches de différentes tailles dans Go. Examinons plus en détail les raisons de ces limitations.

Selon la documentation Go, les éléments de tranche ont des valeurs d'index allant de 0 à len(s)-1, indiquant que la capacité maximale d'une tranche est déterminée par le taille de l'entier natif sur la build cible.

En examinant le code source, nous découvrons un contrôle de sécurité qui garantit que la création de tranches de certaines tailles est réalisable :

if len64 < 0 || int64(len) != len64 || t.elem.size > 0 && uintptr(len) > maxmem/uintptr(t.elem.size) {
    panic(errorString("makeslice: len out of range"))
}
Copier après la connexion

Dans votre cas, la condition uintptr(len) > maxmem/uintptr(t.elem.size) devient vrai, interdisant l'allocation demandée. En effet, la mémoire requise pour la tranche dépasserait la limite de mémoire maximale.

Cependant, lorsque vous allouez une tranche de structures vides, qui ne consomment aucune mémoire, la même taille d'allocation devient autorisée :

r := make([]struct{}, math.MaxInt64)
Copier après la connexion

En effet, la condition évaluant les besoins en mémoire devient fausse puisque les structures vides ne consomment aucune mémoire. Go permet de créer des tranches de très grandes capacités pour de tels types.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal