Frage

Wir c ++ verwenden, eine Anwendung zu entwickeln, die 4 auf einem Embedded-System in Windows CE ausgeführt wird.

Einer unserer Einschränkung ist, dass der gesamte Speicher von der Anwendung verwendet wird während der Inbetriebnahme nur zugewiesen werden. Wir schrieben eine Menge von Containern und Algorithmen, die nur vorbelegt Speicher statt Zuteilung neu verwenden.

Halten Sie es uns möglich ist, um die Boost-Bibliotheken zu verwenden, anstatt unsere eigenen Container unter diesen Bedingungen?

Alle Kommentare und / oder Ratschläge sind willkommen!

Vielen Dank,

Nic

War es hilfreich?

Lösung

Sie können Ihre eigene Allocator für den Container schreiben, die sich aus einer festen Größe statischen Puffer zuordnet. In Abhängigkeit von dem Nutzungsmuster des Behälters des Zuordner als Inkrementieren einen Zeigers könnte so einfach sein (zum Beispiel, wenn Sie nur Sachen in die Behälter einlegen einmal bei ca. Inbetriebnahme und keine Elemente nicht kontinuierlich hinzufügen / entfernen.)

Andere Tipps

Wir verwenden Schub für eingebettete Systeme . Mit Boost können Sie wählen, und wählen , was Sie verwenden. Wir verwenden smart_ptr und boost::bind in allen unseren Projekten. Wir schreiben Software für billige Geräte . Und wenn Windows CE auf Ihrer Hardware laufen kann ich würde erwarten, dass Teile boost anwendbar wären. Es gibt Teile der Verstärkung, die keine Zuordnung haben und Sie könnten sie nützlich finden.

Ich würde wählen, und wählen auf der Grundlage Ihrer Anforderungen.

Wie alles, die Sie verwenden, müssen Sie die Kosten kennen.

Ersetzen Sie Ihre Behälter mit Boost-Container ist nicht eine gute Idee. Die Arbeit machen, entsprechende benutzerdefinierte Verteilern nicht so schlimm sein würde, aber Sie würden den Geist Ihres ‚zuweisen beim Start‘ -Regel verstoßen. Die Idee hinter dieser Regel (nach meiner Erfahrung) ist in der Regel sicher, dass Sie müssen nicht mit den Speicher-Typ Situationen zur Laufzeit beschäftigen. Die Idee ist, um sicherzustellen, dass Sie den gesamten Speicher haben Sie möglicherweise bereits zu Beginn braucht, so dass es keine Möglichkeit irgendeines Teils des Systems kurz Speicher auf später kommen.

Wenn Sie die Boost-Container mit einem benutzerdefinierten allocator verwendet, dann würden Sie plötzlich mit der Möglichkeit auseinandersetzen müssen, dass der Pool die Behälter aus zuteilt leer gehen könnte, so dass der Zweck der ‚zuweisen beim Start-Regel‘ zu beseitigen.

In der Situation einer begrenzten Speichervorrichtung, würde ich jede Art von Behälter komplexer als eine statisch zugewiesene Array vermeiden.

Boost ist ein Satz von Bibliotheken. Einige von ihnen sind auf Metaprogrammierung fokussiert. Diejenigen, verwenden Sie nicht einmal einen Speicher zur Laufzeit. Aber Ihre Frage scheint zu ersetzen Ihre Container zu sein. Ich würde bezweifeln, dass es möglich ist, außer benutzerdefinierte Verteilern verwenden. Aber selbst dann ist es sehr wahrscheinlich, würden Sie Ebene STL-Containern und nicht erhöhen werden. Boost nur liefert den TR1-Container, für die Compiler, die noch nicht enthalten TR1.

Nicht-Boost verwenden.

Es ist eine große Bibliothek und Ihre grundlegende Speicherzuweisung Anforderungen sind sehr verschieden von denen der Bibliotheken Designer.

Auch wenn Sie eine aktuelle Version von Boost Arbeit nach Ihren Anforderungen mit benutzerdefinierten Verteilern bekommen es mit einer neuen Version der Boost-brechen.

Fühlen Sie sich frei auf der Boost-Quellcode für einige nützliche Ideen obwohl aussehen, aber eine eigene Implementierung für verwenden, was Sie brauchen.

Ich bin in dieses Recht nun auf der Suche - Ich mochte Ringpuffer verwenden, schleusenfreien Behälter und asynchrone I / O, und stattdessen dynamischen Speichers der Zuweisung, würde ich es vorziehen, Speicherpools verwenden

Das größte Problem, das ich bisher gesehen habe, ist, dass shared_ptr wird in vielen Orten, ohne einfache Art und Weise verwendet, um sie zu ersetzen mit intrusive_ptr . Da shared_ptr dynamischen Speicher reserviert Spur der Referenzzähler zu halten, kann ich es nicht in einem eingebetteten System verwenden.

Diese Fixierung sieht machbar, aber eine Menge Arbeit - ich habe die Vorlage Spezifikation jeder Klasse zu erweitern, die eine shared_ptr enthält, so dass die spezifische Art von Shared-Pointer kann auf Wunsch geändert werden, um intrusive_ptr. So, jetzt muss ich, wie viel Arbeit berücksichtigen, die sein werden, im Vergleich zu, wie viel Arbeit es sein werde, meine eigene Version der Boost-Funktionen, die ich brauche zu schreiben. Kein angenehmer Ort sein.

Ich hoffe, dass jemand darauf hin, warum ich falsch liege darüber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top