Wir verwenden C ++, um eine Anwendung zu entwickeln, die in Windows CE 4 auf einem eingebetteten System ausgeführt wird.
Eine unserer Einschränkungen besteht darin, dass der gesamte von der Anwendung belegte Speicher nur während des startup zugewiesen werden darf. Wir haben eine Menge von Containern und Algorithmen geschrieben, die nur vorher zugewiesenen Speicher verwenden, anstatt einen neuen zuzuweisen.
Glauben Sie, dass es uns möglich ist, unter diesen Bedingungen die Boost-Bibliotheken anstelle unserer eigenen zu verwenden?
Alle Kommentare und / oder Ratschläge sind willkommen!
Vielen Dank
Nic
Sie könnten Ihren eigenen Zuordner für den Container schreiben, der ihn aus einem statischen Puffer mit fester Größe zuweist. Abhängig von den Verwendungsmustern des Containers könnte der Allokator einfach einen Zeiger inkrementieren (z. B. wenn Sie nur einmal beim Start der App Daten in den Container einfügen und Elemente nicht kontinuierlich hinzufügen / entfernen).
Wir verwenden Boost für eingebettete Systeme . Mit Boost können Sie wählen und auswählen, was Sie verwenden. Wir verwenden smart_ptr
und boost::bind
in allen unseren Projekten. Wir schreiben Software für billige Handys .
Und wenn Windows CE auf Ihrer Hardware laufen kann, würde ich erwarten, dass Teile von Boost anwendbar wären.
Es gibt Teile von Boost, die keine Zuweisung haben und Sie könnten sie nützlich finden.
Ich würde nach Ihren Anforderungen auswählen und auswählen.
Wie alles, was Sie verwenden, müssen Sie die Kosten kennen.
Boost ist eine Sammlung von Bibliotheken. Einige von ihnen konzentrieren sich auf die Metaprogrammierung von Vorlagen. Diese verwenden zur Laufzeit keinen Speicher. Aber Ihre Frage scheint zu sein, Ihre Behälter zu ersetzen. Ich würde bezweifeln, dass das möglich ist, außer benutzerdefinierte Zuordner zu verwenden. Aber selbst dann würden Sie höchstwahrscheinlich einfache STL-Container verwenden und nicht boosten. Boost stellt nur die TR1-Container für Compiler bereit, die TR1 noch nicht enthalten.
Ersetzen Sie Ihre Container mit Boost-Container ist keine gute Idee. Die Arbeit, um geeignete benutzerdefinierte Zuordner zu erstellen, wäre nicht so schlimm, aber Sie würden den Geist Ihrer Regel "Allokieren beim Start" verletzen. Die Idee hinter dieser Regel (nach meiner Erfahrung) besteht im Allgemeinen darin, sicherzustellen, dass Sie sich zur Laufzeit nicht mit Situationen mit zu wenig Speicher beschäftigen müssen. Die Idee besteht darin, sicherzustellen, dass Sie über den gesamten Speicher verfügen, den Sie möglicherweise RECHTS AM ANFANG benötigen, so dass keine Möglichkeit besteht, dass ein Teil des Systems später zu wenig Speicher hat.
Wenn Sie die Boost-Container mit einem benutzerdefinierten Zuordner verwendet haben, müssen Sie plötzlich mit der Möglichkeit umgehen, dass der Pool, aus dem der Container zugewiesen wird, leer wird, wodurch der Zweck der Regel 'Bei Start neu zuordnen' entfällt / p>
In der Situation eines begrenzten Speichergeräts würde ich jede Art von Container vermeiden, die komplexer ist als ein statisch zugewiesenes Array.
Benutze Boost nicht.
Es ist eine große Bibliothek und Ihre grundlegenden Speicherzuweisungsanforderungen unterscheiden sich sehr von denen der Bibliotheksdesigner.
Auch wenn Sie eine aktuelle Boost-Version erhalten, die Ihren Anforderungen mit benutzerdefinierten Zuordnern entspricht, kann es mit einer neuen Version von Boost brechen.
Fühlen Sie sich frei, den Quellcode von Boost für einige nützliche Ideen zu betrachten, aber verwenden Sie Ihre eigene Implementierung für das, was Sie brauchen.
Ich schaue mir das gerade an - ich würde gerne zirkuläre Puffer, lockfreie Container und asynchrone I / O verwenden, und anstatt dynamischen Speicher zuzuweisen, würde ich lieber Speicherpools verwenden.
> Das größte Problem, das ich bisher gesehen habe, ist shared_ptr
wird an vielen Orten verwendet und kann nicht einfach durch intrusive_ptr
ersetzt werden. . Da shared_ptr
dynamischen Speicher zuordnet, um den Verweiszähler zu verfolgen, kann ich ihn nicht in einem eingebetteten System verwenden.
Das ist zwar machbar, aber es ist viel Arbeit nötig - ich muss die Template-Spezifikation jeder Klasse, die shared_ptr
enthält, erweitern, damit der spezifische Typ des Shared-Pointers bei Bedarf in intrusive_ptr
geändert werden kann. So, jetzt muss ich überlegen, wie viel Arbeit das sein wird, im Vergleich zu wie viel Arbeit es sein wird, meine eigene Version der Boost-Funktionen zu schreiben, die ich brauche. Nicht ein angenehmer Ort zu sein.
Ich hoffe, jemand weist darauf hin, warum ich falsch liege.
Tags und Links c++ embedded boost windows-ce