Existe-t-il un conteneur qui utilise un tampon local pour un petit nombre d'éléments et utilise une allocation de segment uniquement lorsque le nombre d'éléments dépasse une certaine limite? Semblable à ce que font la plupart des implémentations std::string
.conteneur avec empilement et allocation dynamique
fond
Le récipient est utilisé dans ce qui suit (simplifié) contexte:
Foo foo; // some data
vector<HandlerPtr> tagged; // receives "tagged" items
// first pass: over all items in someList
for each(HandlerPtr h in someList)
{
h->HandleFoo(foo); // foo may become tagged or untagged here
if (foo.Tagged())
tagged.push_back(h);
}
for(auto itr=tagged.rbegin(); itr!=tagged.end(); ++itr)
{
// ...
}
Cette partie A du code haute fréquence d'appel, mais le marquage d'un élément est assez rare, le nombre des articles dans someContainer
est généralement faible mais non lié. Je ne peux pas utiliser facilement un tampon "plus global" préalloué. L'objectif est d'éviter l'allocation fréquente.
Appel Fréquence
- commun: aucun élément devient marqué. std :: vector is fine
- Commun: seulement un des rares articles a été étiqueté. provoque l'allocation haute fréquence je veux éviter
- Très rare, mais il doit être pris en charge: somelist se développe lors de la première passe, le nombre d'éléments non prévisibles, mais encore faible
Voulez-vous utiliser des allocations statiques ou de pile? Pour l'allocation de pile, voir http://stackoverflow.com/questions/354442/looking-for-c-stl-like-vector-class-but-using-stack-storage – nimrodm
@nimrodn: l'allocation de pile est probablement une meilleure description de ce que Je veux (titre fixe). c'est-à-dire un nombre limité d'éléments qui peuvent être stockés dans l'instance de conteneur (sans allocation supplémentaire), et l'utilisation de l'allocation de tas si cela n'est pas suffisant. – peterchen
'std :: vector' n'alloue aucune mémoire avant l'insertion d'au moins un élément. –