J'ai une question très similaire à
mais je pense qu'il vaut la peine de demander à nouveau.
Je veux un std::string
avec le stockage local qui déborde dans le magasin gratuit. std::basic_string
donne un allocateur comme un paramètre du modèle, donc il semble que la seule chose à faire est d'écrire un programme d'allocation de locaux de stockage et de l'utiliser pour paramétrer l' basic_string
, comme suit:
std::basic_string<
char,
std::char_traits<char>,
inline_allocator<char, 10>
>
x("test");
J'ai essayé d'écrire l' inline_allocator
classe qui fonctionne de la manière que vous attendez: il se réserve de 10 octets pour le stockage, et si l' basic_string
a besoin de plus de 10 octets, puis il appelle ::operator new()
. Je ne pouvais pas le faire fonctionner. Dans le cadre de l'exécution de la ligne au-dessus de code, mon GCC 4.5 standard de la bibliothèque string appelle le constructeur de copie pour inline_allocator
4 fois. Il n'est pas clair pour moi qu'il y a un moyen judicieux d'écrire le constructeur de copie pour inline_allocator
.
Dans les autres StackOverflow fil, Eric Melski fourni ce lien à une classe dans Chrome:
http://src.chromium.org/svn/trunk/src/base/stack_container.h
ce qui est intéressant, mais ce n'est pas une baisse-dans le remplacement pour std::string
, car elle enveloppe l' std::basic_string
dans un récipient de sorte que vous devez appeler une surchargé operator->()
pour se retrouver à la std::basic_string
.
Je ne peux pas trouver d'autres solutions à ce problème. Se pourrait-il qu'il n'y a pas de bonne solution? Et si cela est vrai, alors l' std::basic_string
et std::allocator
concepts très imparfait? Je veux dire, il semble que ce devrait être un très de base et les cas d'utilisation simple pour std::basic_string
et std::allocator
. Je suppose que l' std::allocator
concept est principalement conçu pour les piscines, mais je pense qu'il devrait couvrir ce ainsi.
Il semble que la rvalue-référence sémantique de déplacement dans C++0x pourrait rendre possible l'écriture d' inline_allocator
, si la chaîne de la bibliothèque est re-écrite, de sorte que basic_string
utilise le constructeur de déplacement de son allocation au lieu de le constructeur de copie. Personne ne sait ce que la perspective est pour ce résultat?
Mon application a besoin de construire un million de petites chaînes ASCII par seconde, donc j'ai fini par écrire ma propre chaîne de longueur fixe de classe basée sur Boost.Array
, ce qui fonctionne très bien, mais c'est encore de me tracasser.