2008-10-03 6 views
8

Wir verwenden C++, um eine Anwendung zu entwickeln, die unter Windows CE 4 auf einem eingebetteten System ausgeführt wird.Boost im eingebetteten System mit Speicherbeschränkung verwenden

Eine unserer Einschränkungen besteht darin, dass der gesamte von der Anwendung belegte Speicher während Startup nur zugewiesen werden soll. Wir haben eine Menge von Containern und Algorithmen geschrieben, die nur zuvor zugewiesenen Speicher verwenden, anstatt einen neuen zuzuweisen.

Denken Sie, dass es uns möglich ist, unter diesen Bedingungen die Boost-Bibliotheken anstelle unserer eigenen Container zu verwenden?

Alle Kommentare und/oder Ratschläge sind willkommen!

Vielen Dank,

Nic

+0

Wie einige Antworten darauf hingewiesen haben, besteht Boost aus einer Reihe von Bibliotheken, von denen jede im Allgemeinen getrennt verwendet werden kann. Sie können nützlichere Antworten erhalten, wenn Sie angeben können, welche Teile von Boost Sie in Betracht ziehen. – jwfearn

Antwort

6

Sie könnten Ihre eigene Allocator für den Container schreiben, die sich aus einer festen Größe statischen Puffer zuordnet. Abhängig von den Verwendungsmustern des Containers könnte der Zuordner einfach einen Zeiger inkrementieren (z. B. wenn Sie nur einmal beim Start der App Daten in den Container einfügen und Elemente nicht fortlaufend hinzufügen/entfernen).

+0

Meiner Erfahrung nach verwenden einige Boost-Bibliotheken einen vom Benutzer angegebenen STL-ähnlichen Zuordner, andere nicht. Einige erlauben die benutzerdefinierte Speicherzuordnung unter Verwendung einer anderen API. Und ich vermute, einige tun sogar alles oben genannte. Leider muss ich noch eine zuverlässige Liste finden, welche welche ist. – jwfearn

1

Boost is eine Reihe 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.

0

Verwenden Sie Boost nicht.

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

Auch wenn Sie eine aktuelle Version von Boost erhalten können, um mit benutzerdefinierten Zuordnern nach Ihren Anforderungen zu arbeiten, kann es mit einer neuen Version von Boost brechen.

Fühlen Sie sich frei, um den Boost-Quellcode für einige nützliche Ideen zu betrachten, aber verwenden Sie Ihre eigene Implementierung für das, was Sie brauchen.

+0

Neue Versionen von Boost werden nicht notwendigerweise auf vom Benutzer bereitgestellten Zuordnern unterbrochen. Leider hängt das völlig davon ab, von welcher der vielen Boost-Bibliotheken wir sprechen und welche, wenn überhaupt, API für die benutzerdefinierte Zuordnung verwenden. – jwfearn

11

Wir verwenden Boost 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 all 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 wählen und wählen Sie basierend auf Ihren Anforderungen.

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

+0

Was sind die Speicherbeschränkungen dieser billigen Telefone? –

+2

Ich habe vor kurzem Boost auf einem MSP430 Mikro mit 6K RAM und 64K Flash verwendet. Einfach auswählen und auswählen. – Ted

1

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 sich plötzlich mit der Möglichkeit befassen, dass der Pool, aus dem der Container zugewiesen wird, leer wird, wodurch der Zweck der Regel 'Bei Start zuweisen' beseitigt wird.

In der Situation eines begrenzten Speichergeräts würde ich jede Art von Container, der komplexer ist als ein statisch zugewiesenes Array, vermeiden.

0

Ich untersuche gerade — Ich möchte zirkuläre Puffer, lock-freie Container und asynchrone E/A verwenden, und anstatt dynamischen Speicher zuzuweisen, würde ich lieber Speicherpools verwenden.

Das größte Problem, das ich bisher gesehen habe, ist, dass shared_ptr in vielen Orten verwendet wird, mit keinen einfachen Weg, es durch intrusive_ptr zu ersetzen. Da shared_ptr dynamischen Speicher reserviert, um den Verweiszähler zu verfolgen, kann ich ihn nicht in einem eingebetteten System verwenden.

dieser Befestigung sieht machbar, aber eine Menge Arbeit — Ich habe die Vorlage Spezifikation jeder Klasse zu erweitern, die ein shared_ptr so enthält, dass die spezifische Art von Shared-Pointer kann auf intrusive_ptr geändert werden, falls gewünscht. 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. Kein angenehmer Ort zu sein.

Ich hoffe jemand darauf hinweist, warum ich falsch liege.