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, 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()
:
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.