Maison > développement back-end > Golang > Pourquoi la longueur de la chaîne semble-t-elle n'avoir aucun impact sur l'utilisation de la mémoire dans la « map[string]string » de Go ?

Pourquoi la longueur de la chaîne semble-t-elle n'avoir aucun impact sur l'utilisation de la mémoire dans la « map[string]string » de Go ?

Susan Sarandon
Libérer: 2024-12-26 12:24:11
original
513 Les gens l'ont consulté

Why Does String Length Seem to Have No Impact on Memory Usage in Go's `map[string]string`?

Utilisation de la mémoire de chaîne dans Golang

Lors de l'optimisation du code à l'aide d'une chaîne map[string] avec seulement deux valeurs possibles ("A" ou "B"), la réduire à un map[string]bool semble être une amélioration évidente des performances. Cependant, les tests révèlent une observation surprenante : l'utilisation de la mémoire d'une chaîne longue ("a2") n'est pas différente d'une chaîne à un seul caractère ("a").

Explication

Pour comprendre ce comportement, il est important de noter que unsafe.Sizeof() ne prend pas en compte la taille des structures de données référencées. Au lieu de cela, il signale uniquement la taille « peu profonde » de la valeur transmise.

Dans Go, les cartes sont des pointeurs vers une structure de données. L'appel de unsafe.Sizeof(somemap) renvoie la taille de ce pointeur, et non la mémoire réelle utilisée par les éléments de la carte.

De même, les chaînes dans Go sont représentées par des en-têtes qui contiennent un pointeur et une longueur. L'appel de unsafe.Sizeof(somestring) renverra la taille de cet en-tête, qui est indépendante de la longueur de la chaîne.

Exigences de mémoire des chaînes

La mémoire réelle requise pour stocker une valeur de chaîne en mémoire est égal à la longueur de sa séquence d'octets codée en UTF-8 plus la taille de son en-tête. Pour calculer cela, vous pouvez utiliser la formule suivante :

stringSize = len(str) + int(unsafe.Sizeof(str))
Copier après la connexion

Découpage de chaînes et utilisation de la mémoire

Il est également important de se rappeler que le découpage de chaînes crée un nouvel en-tête pointant vers le tableau de support du chaîne originale. Cela signifie que même si la chaîne découpée (s2) est petite, l'intégralité du tableau de sauvegarde de la ou des chaînes d'origine sera toujours conservée en mémoire.

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