Gibt es einen Allokator, der alloca verwendet und ansonsten C ++ STL-konform ist?

8

Ich habe zwei Fragen:

1) Ist es möglich, einen Allocator zu implementieren, der Alloca verwendet, um Speicher auf dem Stack zuzuordnen, und ansonsten C ++ STL-kompatibel?

Wenn es Code gibt, können Sie mich glücklich machen, indem Sie einfach auf die URL zeigen. :-) Wenn es dort keinen Code gibt, können Sie vielleicht die Funktionen allocate und deallocate skizzieren?

2) Wenn die Antwort auf die obige Frage "Ja" ist, würde ich gerne verstehen, wie es möglich ist, Speicher auf dem Stapel für Klassenmitglieder zu reservieren. Betrachten Sie als Beispiel ein

%Vor%

und nehmen an, dass ein Aufruf der Elementfunktion 'resize' dieses Vektors zuerst 'Zuweisung' und dann 'Zuweisung' des Zuordners aufruft.

Der Bereich, von dem aus allocate aufgerufen wird, ist der der resize der Memberfunktion. Bedeutet dies nicht, dass der zugewiesene Speicher am Ende dieses Funktionsaufrufs aus dem Stapel entfernt wird?

Mit freundlichen Grüßen, Bjoern

    
Bjoern 02.11.2010, 22:09
quelle

2 Antworten

5

Bjoern, es sieht so aus, als würden Sie fundamental falsch verstehen, wie Stack und Alloca funktionieren. Lesen Sie über sie.

Was Sie fragen, ist unmöglich, weil der von alloca zugewiesene Speicher "freigegeben" wird, wenn Sie von der zugewiesenen Funktion zurückkehren (und anders als Patrick gesagt hat, dass sein Verhalten nicht ändern kann). Ich schreibe "befreit", weil es nicht wirklich freigegeben ist, es geht nur wie jede andere Stapelvariable außerhalb des Bereichs. Wenn Sie es danach verwenden, führt dies zu undefiniertem Verhalten.

Angenommen, Sie reservieren ein Stück Speicher in YourAllocator::allocate , das von d.push_back() :

aufgerufen wird %Vor%

Der von alloca zugewiesene Speicher kann von den Stapelrahmen von push_back und printf überschrieben werden, so dass die Ausgabe möglicherweise nicht 42 ist, ein Absturz oder sonst etwas.

    
ybungalobill 26.11.2010 17:55
quelle
3

Nein, so etwas ist nicht möglich. Zunächst erwartet die STL, mehr Speicher zuzuweisen und dann den alten Speicher freizugeben. Wie werden Sie das auf dem Stapel tun?

Das einzige, was auch nur im Entferntesten dem entspricht, ist ein konservativer Garbage Collector.

    
Puppy 14.12.2010 20:12
quelle

Tags und Links