En C++11 std::basic_string
supporte la sémantique de déplacement, ce qui signifie que vous pouvez optimiser la concaténation d'une série de chaînes de caractères à l'aide de operator+
en allouant de la mémoire pour la première chaîne de la série, puis construit simplement le reste des chaînes dans la mémoire de la première chaîne de la série, ce qui réduit considérablement le nombre d'allocations et de copies de mémoire nécessaires pour concaténer et renvoyer une série de chaînes.
Je suis sûr qu'il y a d'autres optimisations à faire comme vous l'avez souligné avec la méthode de Qt, mais la sémantique de déplacement permise par le C++11 surmonte un énorme obstacle à la performance qui existait dans la version C++03 de std::basic_string
surtout lorsqu'il s'agit de concaténer un grand nombre de chaînes de caractères.
Ainsi, par exemple, quelque chose comme
std::string a = std::string("Blah blah") + " Blah Blah " + " Yadda, Yadda";
peut se faire en allouant de la mémoire pour la première chaîne, puis en utilisant la sémantique de déplacement, en "volant" la mémoire restante de la première chaîne pour construire les deux autres chaînes à la place, et en ne réallouant de la mémoire que lorsqu'il n'y a plus d'espace disponible. Enfin, l'opérateur d'affectation peut, en utilisant la sémantique de déplacement, "voler" la mémoire de la valeur r temporaire créée du côté droit de l'opérateur d'affectation, empêchant ainsi une copie de la chaîne concaténée.