2010-11-02 24 views
8

J'ai deux questions:Existe-t-il un allocateur qui utilise alloca et est compatible CML STL?

1) Est-il possible d'implémenter un allocateur qui utilise alloca pour allouer de la mémoire sur la pile et est compatible CML STL?

S'il y a du code là-bas, vous pouvez me rendre heureux en me dirigeant simplement vers l'URL. :-) S'il n'y a pas de code là-bas, peut-être vous pouvez esquisser les fonctions allouer et désallouer?

2) Si la réponse à la question ci-dessus est «oui», j'aimerais comprendre comment il est possible d'allouer de la mémoire sur la pile pour les membres de la classe. À titre d'exemple, envisager une

std::vector<int, AllocaAllocator<int> > 

et supposons qu'un appel de la fonction membre « resize » de ce vecteur appelle d'abord « deallocate », puis « attribuer » de l'allocateur.

L'étendue à partir de laquelle allocate est appelée est celle de la fonction membre resize. Cela ne signifie-t-il pas que la mémoire allouée est retirée de la pile à la fin de cet appel de fonction?

Cordialement, Bjoern

+3

Vous ne pouvez pas libérer l'espace que vous avez alloué sur la pile via alloca. La seule façon d'obtenir de la mémoire allouée par alloca est de quitter la fonction. – Patrick

+0

Cela signifie-t-il que, si vous quittez une fonction, toute la mémoire allouée dans cette fonction sur la pile via alloca est libérée? Et cela implique-t-il qu'il est impossible d'utiliser alloca pour allouer de la mémoire aux membres de la classe? Ainsi, est-il impossible d'écrire un allocateur qui utilise alloca? – Bjoern

+2

Jetez un oeil à cette question: "Rechercher une classe de vecteurs de type STL C++ mais en utilisant le stockage de pile" (http://stackoverflow.com/q/354442) Il existe déjà quelques commentaires utiles sur ce sujet. –

Répondre

5

Bjoern, il semble que vous ne comprenez pas fondamentalement la façon dont pile et le travail de alloca. Lisez à propos d'eux. Ce que vous demandez est impossible parce que la mémoire allouée par alloca est "libérée" lorsque vous revenez de la fonction qui l'a alloué (et contrairement à Patrick a déclaré, inline ne peut pas changer son comportement). J'écris "libéré" parce qu'il n'est pas réellement libéré, il sort juste hors de portée comme n'importe quelle autre variable de pile. Donc, l'utiliser après provoque un comportement indéfini.

Supposons que vous allouez un morceau de mémoire dans YourAllocator::allocate qui est appelé à partir d.push_back():

deque<int, AllocaAllocator> d; 
d.push_back(42); // calls alloca 
printf("Hello\n"); 
printf("%d\n", d[0]); 

La mémoire allouée par alloca peut être écrasée par la pile cadres de push_back et printf, de sorte que la sortie ne peut être 42, il peut tomber en panne, ou toute autre chose.

3

Non, ce genre de chose n'est pas possible. Pour commencer, le STL s'attend à allouer plus de mémoire, puis libérer l'ancienne mémoire. Comment allez-vous faire cela sur la pile?

La seule chose, même à distance équivalente à ceci est un garbage conservateur conservateur.

+0

+1 pour "le STL s'attend à allouer plus de mémoire, * puis * libérer l'ancienne mémoire Comment allez-vous faire ça sur la pile?" –