statische und dynamische Objekte in der selben Liste



  • Wenn du Objekte auf dem Stack in einer Liste haben möchtest, impliziert das, dass die Liste ihre Knoten nicht selbst verwaltet oder aber dass die Knoten nur einen Pointer auf die Elemente beinhalten, nicht aber die Elemente selbst. Ich nehme an, dass du dich da etwas ungenau ausgedrückt hast.

    Eine Liste, die ihre Knoten nicht selbst verwaltet, wäre ein ziemlich krüppeliges Ding, du müsstest an Stelle der Objekte dann die kompletten Knoten selber anlegen (auf dem Stack und/oder Heap, wie du es grade brauchst) und sie dann der Liste übergeben. Halte ich für nicht sehr elegant.

    Eine Liste, die nur simple C-Pointer auf die Objekte beinhaltet, könnte zwar Stack- und Heap-Objekte beinhalten, kann aber nicht wissen, welche der Objekte auf dem Heap liegen und daher deren Speicher nicht freigeben. Darum müsstest du dich also selber kümmern.

    Soll die Liste die Heapobjekte selber verwalten und freigeben, müsstest du eine Art Smartpointer selber schreiben, der weiß, welche Elemente wo liegen.

    So oder so würde ich mich Sepp allerdings anschließen - es klingt viel zu abenteuerlich. Vor allem ist die Frage, wie viel effizienter die Erstellung auf dem Stack ist (Profiler, nicht eigene Schätzung), und ob das den Aufwand einer solchen Listenverwaltung rechtfertigt. Ggf. würde eine eigene Speicherverwaltung auch einiges an Effizienz bringen. Laut dem was du geschrieben hast, sind die Stack-Objekte "von Anfang an vorhanden". Wenn das bedeutet, dass sie beim Start deiner VM einmal erzeugt werden und dann in der Liste verwaltet werden sollen, dürfte die Performance doch nicht ganz so kritisch sein wie bei der eigentlichen Laufzeit der VM oder?



  • Es ist nur so, dass der Stack bei der Erstellung der Objekte effizienter ist

    Dein Programm startet dann 0.03s schneller. Wow.



  • Ok, danke Leuts

    Werde von dieser Vermischung absehen und alle mit new anfordern. Für weitere Optimierungen ist später immer noch Zeit.



  • Nimm einen speziellen Allokator (z.B. Boost.Pool), wenn dir new zu langsam ist.


  • Mod

    Eine einfache Optimierung die höchstwahrscheinlich etwas bringt, wäre die STL oder boost benutzen, anstatt alles selber zu machen. Dein Vorhaben klingt so, als wolltest du eine intrusive, einfach verkettete Liste. Gibt's bei Boost schon fertig und mindestens genau so schnell wie du es selbst mit viel Aufwand machen könntest.

    Außerdem sind verkettete Listen eher etwas für die A&D-Vorlesung, in der Praxis sind sie oftmals deutlich langsamer als eine von der Laufzeitkomplexität her eigentlich weniger geeignete Datenstruktur, die dafür kleinere Konstanten hat (die Liste hat riesige Konstanten im Vergleich zu anderen Containern)



  • std::list habe ich bisher vor allem verwendet, falls Iteratoren gültig bleiben müssen. Boost 1.48 bringt jedoch mit boost::stable_vector eine sehr interessante Alternative raus 💡



  • Wie wäre es mit :

    Object x;
    myList.push_back(&x); //Heißt die Methode bei Listen so ^^^?
    


  • pyhax schrieb:

    Wie wäre es mit :

    Object x;
    myList.push_back(&x); //Heißt die Methode bei Listen so ^^^?
    

    Keine Gute Idee.

    List<Object*> myList;
    {
      Object x;
      myList.push_back(&x);
    } // jetzt enthält myList einen Zeiger auf ein zerstörtes Objekt, ganz böse Sache, da stirbt jedes mal eine süße Katze
    


  • Na dann muss man halt new & delete nutzen 😛



  • Muss man nicht.


Anmelden zum Antworten