Polymorphismus ohne Heap allokation
-
Hallo,
ich arbeite gerade mit einem Mikrocontroller bei welchem der Arbeitsspeicher relativ klein ist (ESP32).
Ich stoße jetzt bereits an die grenzen und suche nun nach einer Möglichkeit Polymorphismus ohne dynamischen Speicher zu erreichen.Konkret geht es bei mir um UI-Elemente welche ich in einem Container ablege und anschließend in einer Task die Draw Methode auf die Elemente aufrufe.
Eine Möglichkeit die ich gefunden habe ist hier:
https://barrgroup.com/Embedded-Systems/How-To/Polymorphism-No-Heap-MemoryGibt es andere Ansätze?
-
DKlay17 schrieb:
Gibt es andere Ansätze?
Kein Ahnung: TL;DR
-
manni66 schrieb:
DKlay17 schrieb:
Gibt es andere Ansätze?
Kein Ahnung: TL;DR
Okay....
Kann man das mit einem Custom Allocator erreichen der schon zur Kompilierzeit einen Bereich auf dem Flash-Speicher (nicht HEAP) reserviert?
-
struct A {}; struct B : A {}; B aB; A* aA = &aB;
Was ist deine Frage?
-
Polymorphie hat nichts mit dynamischem Speicher zu tun, das kann genauso mit statischen oder Stack-Objekten gemacht werden.
In dem SongMaker-Beispiel ist der Grund für den Heap-Speicher nicht die Polymorphie, sondern dass das Instrument zur Laufzeit austauschbar sein soll.
Wenn du sowas hier hast:
class IDrawable { public: virtual void Draw () = 0; }; class Button : public IDrawable { public: void Draw () { /* ... */ } }; class UIContainer { public: std::some_container<IDrawable*> items; void add (IDrawable * drawable); }; Button button1; UIContainer container; int main (void) { Button button2; container.add (button1); container.add (button2); for (auto it : container.items ()) { it->Draw(); } }
dann spielt es keine Rolle, wo die Objekte angelegt sind. In diesem Fall liegt button1 im Datensegment und button2 auf dem Stack, und Heapspeicher ist überhaupt nicht im Spiel.
-
Wo ist deine Antwort?
Du hast recht habe diese simple Variante unbeachtet gelassen.
Hat sich somit erledig, Danke!Würde trotzdem gern wissen ob das mit dem Custome Allocator funktionieren würde. Habe mich noch nie mit Allocator auseinandergesetzt.
Memory-Pool (irgendwo auf dem Flashspeicher mit fester größer)
Custom Allocator (mit placement new den Speicher vom Pool verwenden...)