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
Susan Sarandonoriginal
2024-12-26 12:24:11549parcourir

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))

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!

Déclaration:
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