Depuis le passage à C++11 (si je ne dis pas de bêtises) et le cassage d'ABI qui va avec, la norme impose aux std::string l'optimisation SSO (Small String Optimisation),
En gros, l'implémentation "classique" du stockage de l'information dans une std::string ressemble fortement à celle d'un std::vector, un pointer pour le début, un pour la fin de la string et un pour la fin de la zone allouée.
ça fait donc 3 pointeurs, et en 64 bits, 24 octets donc.
Du coup au lieu d'allouer de l'espace mémoire pour les petites strings (moins de 23 octet pour garder le 0 terminal), on peut simplement se servir de ces 24 octets pour mettre la donnée "directement"
Pour ces petites string le temps de la copie est négligeable par rapport au temps d'allocation et en particulier c'est thread-safe par rapport à un std::move.
Voila pourquoi SSO est maintenant le standard pour les std::string.
PS: l'implémentation est un peu plus compliquée que cela, du coup c'est un peu moins de 23 octets, tu peux essayer de faire des tests pour voir à partir de quand le comportement change.
# SSO Optimisation
Posté par moi1392 . En réponse au message probleme de compréhension sur les rvalue et std::move. Évalué à 2.
Depuis le passage à C++11 (si je ne dis pas de bêtises) et le cassage d'ABI qui va avec, la norme impose aux std::string l'optimisation SSO (Small String Optimisation),
En gros, l'implémentation "classique" du stockage de l'information dans une std::string ressemble fortement à celle d'un std::vector, un pointer pour le début, un pour la fin de la string et un pour la fin de la zone allouée.
ça fait donc 3 pointeurs, et en 64 bits, 24 octets donc.
Du coup au lieu d'allouer de l'espace mémoire pour les petites strings (moins de 23 octet pour garder le 0 terminal), on peut simplement se servir de ces 24 octets pour mettre la donnée "directement"
Pour ces petites string le temps de la copie est négligeable par rapport au temps d'allocation et en particulier c'est thread-safe par rapport à un std::move.
Voila pourquoi SSO est maintenant le standard pour les std::string.
PS: l'implémentation est un peu plus compliquée que cela, du coup c'est un peu moins de 23 octets, tu peux essayer de faire des tests pour voir à partir de quand le comportement change.