Eigener 'Stack' in C++

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Eigener 'Stack' in C++

Beitrag von dronus »

Hallo,

ich versuche seit Tagen erfolglos eine eigene explizite Variante des User-Stacks zu programmieren. Grund ist, dass ich in einer rekursiven Berechnung eine weitere Baumstruktur verwende, die aber nicht unbedingt in der selben Richtung (höher oder tiefer im Baum) durchlaufen wird wie die Rekursion im Programmablauf. Außerdem verspreche ich mir davon, eine rekursive Verarbeitung unterbrechen, fortsetzen und auf mehrere Threads umverteilen zu können.

Ich brauche nicht die ganze Flexibilität des echten Stacks, aber es sollte in etwa sowas geben:

Code: Alles auswählen

class StackFrame
{
   ....
}

class Stack
{
public:
    void push(StackFrame& frame);
    StackFrame pop();
    StackFrame* peek();
}
wobei die eigentlichen Objekte von StackFrame abgeleitet werden.

Nun das große Problem: Der Stack kann die Objekte nicht in einem Array StackFrame stack[] oder STL-vector oder oder oder speichern, weil die Objekte ja abgeleitet und dann verschieden groß sind. Ich kann sie auch nicht 'von Hand' in einen Speicher legen, weil ich in C++ keine Möglichkeit sehe, zur Laufzeit die echte Größe des Objektes herauszufinden.

Zwar kann man den new-Allokator überladen, und dann mit StackFrame* s=new(stack) StackFrame(); das Objekt 'pushen', aber dann gibt es keinen überladbaren delete-Operator dazu, und es fehlt die klassische 'push', 'pop' Semantik.

Andere schlugen mir vor, std::shared_ptr's in einem std::vector zu speichern, aber dann sind die echten Objekte ja auf dem Heap letztlich mit malloc reserviert, und nur die Pointer darauf effizient auf dem Stack reserviert. Das ist nicht Sinn der Sache... ich hätte gerne die echten Objekte linear im Speicher abgelegt, um sie effizient pushen und poppen zu können.

Kann man da was machen?
Benutzeravatar
Krishty
Establishment
Beiträge: 8240
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Eigener 'Stack' in C++

Beitrag von Krishty »

Arbeitest du unter Windows? Dann solltest du Fibers ausprobieren. Sonst hat C++’ STL AFAIK so etwas wie Coroutines, die du ebenfalls nutzen kannst. Dann musst du keinen eigenen Stapel programmieren.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: Eigener 'Stack' in C++

Beitrag von dronus »

Ich würde gerne so platform-befreit wie möglich agieren.. C++ und OpenGL compiliert sich auch für Waschmaschinen und Webbrowser :-p
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: Eigener 'Stack' in C++

Beitrag von dronus »

Hab grad nachgesehen, STL hat keine Coroutinen. Es gibt aber C++-Fiesematenten mit denen man Coroutinen schreiben kann bzw. Bibliotheken dafür (in BOOST bestimmt auch). Dennoch würde ich den eigenen Stapel vorziehen, auch weil er die Daten optimal zugreifbar macht für Debugging, Serialisierung, peek in ältere Stack-Frames usw.
dronus
Establishment
Beiträge: 114
Registriert: 11.01.2010, 01:53

Re: Eigener 'Stack' in C++

Beitrag von dronus »

Das mit der Thread-Verteilung hab ich erstmal ad acta gelegt, und das Problem mit den Richtungen auch. Was bleibt ist die Schwierigkeit verschieden große Kindobjekte auf den Stack zu legen, und das mache ich jetzt tatsächlich erstmal mit dem normalen User Stack.

Damit ich keine Container irgendeiner Art für die Kindobjekte brauche, habe ich eine zentrale Rekursionsstruktur gebaut, mit der man verschiedene Funktionen nach dem Visitor-Prinzip einklinken kann. Damit gibt es gar keine Container mehr, sondern es liegt immer nur ein Objekt pro Rekusionsebene auf dem Stack, sobald der nächste Kindknoten verarbeitet wird ist der letzte schon vergessen.
Antworten