Quels sont les mécanismes de court optimisation de la chaîne dans la libc++?

Cette réponse donne un bel aperçu de haut niveau de court optimisation de la chaîne d'authentification unique (SSO). Cependant, j'aimerais savoir plus en détail comment cela fonctionne dans la pratique, en particulier dans la libc++ mise en œuvre:

  • Comment ne court la chaîne doivent être afin de se qualifier pour le SSO?
    Fait cela dépend de l'architecture cible?

  • Comment la mise en œuvre de la distinction entre court et long
    les chaînes lors de l'accès à la chaîne de données? Est-ce aussi simple que de m_size <= 16 ou est-il un indicateur qui fait partie d'une autre variable de membre? (Je
    imaginez que m_size ou en partie, il pourrait également être utilisé pour stocker
    chaîne de données).

J'ai posé cette question spécifiquement pour la libc++ parce que je sais qu'il utilise l'authentification unique, c'est même mentionné sur le libc++ page d'accueil.

Voici quelques observations après avoir regardé la source:

libc++ peut être compilé avec deux légèrement différente de la mémoire des mises en page pour la classe string, elle est régie par la _LIBCPP_ALTERNATE_STRING_LAYOUT drapeau. Les deux mises en page aussi faire la distinction entre little-endian et big-endian machines qui nous laisse avec un total de 4 variantes différentes. Je suppose que le "normal" layout et little-endian dans ce qui suit.

En supposant en outre que size_type est de 4 octets, et que value_type est de 1 octet, c'est ce que les 4 premiers octets d'une chaîne pourrait ressembler à de la mémoire:

//short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
       ^- is_long = 0

//long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
       ^- is_long = 1

Car la taille de la chaîne est dans la partie supérieure de 7 bits, il doit être modifié pour y accéder:

size_type __get_short_size() const {
    return __r_.first().__s.__size_ >> 1;
}

De même, les getter et setter pour la capacité d'une longue chaîne utilise __long_mask pour contourner la is_long peu.

Je suis toujours à la recherche d'une réponse à ma première question, c'est à dire la valeur qu'aurait __min_cap, la capacité de chaînes courtes, de prendre pour différentes architectures?

D'autres implémentations de la bibliothèque standard

Cette réponse donne un bel aperçu de std::string mémoire de dispositions dans d'autres implémentations de la bibliothèque standard.

  • libc++ étant open-source, vous pouvez trouver sa string d'en-tête ici, je suis de le vérifier à l'instant 🙂
  • Vous pourriez être intéressé par Petite Optimisation de la Chaîne et les Opérations de Déplacement
  • M.: je l'avais vu avant, malheureusement c'est un très gros fichier, merci pour l'aide à la vérifier.
  • Je suis tombé sur ceci dans googler autour. Cependant, ce blog dit explicitement que c'est seulement une illustration de la SSO et pas très optimisé variante qui serait utilisé dans la pratique.