Comment dois-je allouer un std::string sur la pile à l'aide de la glibc dans la chaîne de mise en œuvre?
int main(void)
{
std::string foo("foo");
}
Ma compréhension est que le code ci-dessus utilise la valeur par défaut de l'allocateur pour appeler de nouveaux. Ainsi, même si les std::string toto est alloué sur la pile de la mémoire tampon interne à l'intérieur de foo est alloué sur le tas.
Comment puis-je créer une chaîne qui est entièrement allouée sur la pile?
- Permettez-moi de modifier que "comment puis-je créer un std::basic_string qui est entièrement allouée sur la pile?"
- Juste à relier à une question similaire: stackoverflow.com/questions/354442/...
Vous devez vous connecter pour publier un commentaire.
Je voulais le faire moi-même récemment et a trouvé le code suivant éclairante:
Chronium de stack_container.h
Il définit une nouvelle
std::allocator
qui peut fournir la pile en fonction de répartition de la dotation initiale de stockage pour les conteneurs STL. J'ai fini par trouver un autre moyen de résoudre mon problème, donc je n'ai pas utiliser le code moi-même, mais ce sera peut-être utile pour vous. Assurez vous de lire les commentaires dans le code concernant l'utilisation et les mises en garde.À ceux qui ont mis en doute l'utilité et de la raison de le faire, pensez à:
Certaines personnes ont fait remarquer qu'une chaîne qui utilise la pile, l'allocation ne sera pas un
std::string
comme si en quelque sorte ce qui diminue son utilité. Vrai, vous ne pouvez pas utiliser les deux de façon interchangeable, donc vous ne serez pas en mesure de passer votrestackstring
à des fonctions attend à unestd::string
. Mais (si vous le faites à droite), vous serez en mesure d'utiliser toutes les mêmes fonctions de membre sur votrestackstring
que vous utilisez maintenant surstd::string
, commefind_first_of()
,append()
, etc.begin()
etend()
fonctionnent encore correctement, de sorte que vous serez en mesure d'utiliser la plupart des algorithmes de la STL. Bien sûr, il ne sera passtd::string
dans le sens le plus strict, mais il sera toujours un "string" dans le sens pratique, et il sera toujours très utile.Le problème est que
std::basic_string
a un paramètre de modèle pour l'allocateur. Maisstd::string
n'est pas un modèle et n'a pas de paramètres.Ainsi, vous pouvez en principe utiliser une instanciation de
std::basic_string
avec un allocateur qui utilise de la mémoire sur la pile, mais il ne serait pas unstd::string
. En particulier, vous n'en aurez pas polymorphisme d'exécution, et vous ne pouvais pas laisser passer les objets qui en résultent dans les fonctions attend à unestd::string
.Vous ne pouvez pas. Sauf que...
std::string
est une instanciation deVous pourrait éventuellement définir un Allocateur de classe qui l'utilise alloca pour la gestion de la mémoire. Cela ne fonctionne que si l'Allocateur de lui-même, et le
basic_string
méthodes que l'invoquer directement ou indirectement, sont tousinline
. Unbasic_string
objet créé avec cette allocation ne serait pas être unstd::string
, mais il allait se comporter (en grande partie) comme il. Cependant, ce serait une bonne quantité de travail pour des gains limités. Plus précisément, l'utilisation de cette classe pour les valeurs de retour d'une fonction serait un obstacle à l'avancement.Je n'ai aucune idée de pourquoi vous ou quelqu'un d'autre aurait envie de le faire.
alloca
alloue à partir d'une des fonctions locales frame de pile. Une fois que cela est hors de portée, la mémoire allouée est automatiquement libéré.basic_string
et allocateurs de travail, et pourquoi vous vous ne pouvez pas faire beaucoup avec dynamique de la mémoire sur la pile.Je soupçonne que de faire une telle chose serait difficile de le faire, je me demande pourquoi vous voulez le faire? Pour allouer quelque chose d'entièrement sur la pile, le compilateur doit savoir au moment de la compilation de ce que la taille exacte de la chose est dans votre exemple, il serait nécessaire de connaître non seulement la taille de la
std::string
de métadonnées, mais aussi de la taille de la chaîne de données elle-même. Ce n'est pas trop souple, vous auriez probablement besoin de différents types de chaînes en fonction de la taille de la chaîne de données que vous souhaitez inclure dans ti - pas qu'il serait impossible à faire, il aurait tendance à compliquer un peu les choses.