Gibt es eine nette Möglichkeit, "geteiltes Objekt" in C ++ zu erstellen?

8

Zunächst möchte ich sagen, dass ich Software für Mikrocontroller entwickle, also RAM-Nutzung wichtig ist und es sinnvoll ist, große Blöcke von const Daten in nichtflüchtigen (Flash-) Speicher zu legen.

Was ich versuche zu erreichen, ist eine nette Möglichkeit, ein "geteiltes" Objekt in C ++ zu erstellen. Als Beispiel nehmen wir an, dass es ein Byte Daten (Lesen / Schreiben) und einen Multibyte- "Beleg" gibt, um darauf zuzugreifen. Nehmen wir an, die "Quittung" ist eine lange Zeichenfolge, die ein Dateiname ist, und das Medium, auf das es zeigt, ist langsam, daher ist es sinnvoll, das einzelne Byte im Speicher zu puffern, anstatt es bei jeder Anforderung tatsächlich zu lesen.

%Vor%

Das offensichtliche Problem bei diesem Ansatz ist, dass ganze 130 Bytes im RAM landen, während nur zwei von ihnen geändert werden müssen. Also habe ich eine Idee von Split-Objekt:

%Vor%

Nun, das einzige Problem ist, dass, wenn ich ein paar hundert solcher Split-Objekte haben möchte, der Prozess der Erstellung (also das Erstellen von ZWEI Objekten und das Verknüpfen von Second-To-First) ziemlich langweilig und problematisch wird ...

Die Frage ist also - gibt es eine nette Möglichkeit, es einfacher zu benutzen, am besten einen cleveren C ++ - Trick oder vielleicht eine Vorlagen-Magie? Das ist - wie man ZWEI Objekte, die miteinander verbunden sind, mit einer einzigen Aussage erzeugt, vorzugsweise ist ein Objekt versteckt? Ich glaube nicht, dass eine Makro-Lösung hier möglich ist, da es keine einfache Möglichkeit gibt, die Erstellung des Namens für ein Speicherobjekt zu automatisieren. Die Objekte müssen vom gleichen Typ sein, da ich Zeiger auf solche Objekte an anderen Stellen einbetten muss (Eine Funktion beschäftigt sich damit, sie zu schreiben, andere nur das Lesen). Alle Lösungen, an die ich gedacht habe, erfordern die Verwendung einer virtuellen Schnittstelle zu Vorlagen (damit Sie das Objekt durch den vtable pointer vergrößern UND wahrscheinlich eine Bonusvorlage erhalten -bloat) oder zu einem riesigen Template Bloat führen ...

BEARBEITEN:

Tatsächlich kann ein Teil des gesamten Problems auf eine einfachere Frage reduziert werden - gibt es eine Möglichkeit, eine anonyme Variable an ein Mitgliedsfeld in C ++ zu "binden"? Sth wie:

%Vor%

Im obigen "Wunschdenken" -Halter ist das const-Objekt im ROM und es hat einen Zeiger / Verweis / was auch immer auf ein anonymes Objekt, das NonConstData "irgendwo" im RAM erstellt hat. Oder:

%Vor%

Alles, was es mir erlauben würde, NICHT beide Objekte manuell zu erstellen und aneinander zu binden.

    
Freddie Chopin 12.02.2013, 17:29
quelle

6 Antworten

2

Sie können einen Zeiger durch eine Ganzzahl ersetzen und ein einzelnes statisches Array für alle Ihre DataNonConst -Objekte erstellen, wie folgt:

%Vor%

Dieser Ansatz wurde vom Flyweight-Muster inspiriert, obwohl er offensichtlich für etwas anderes verwendet wird Zweck hier.

Ein offensichtlicher Nachteil ist, dass Sie Ihre Einträge manuell zählen müssen, um Doppelungen zu vermeiden. Allerdings gibt es nur ein storages -Objekt, also nichts anderes zu erstellen.

    
dasblinkenlight 12.02.2013 18:04
quelle
2

Soweit ich sehe, ist das einzige Problem hier, dass Ihr "Handle" -Objekt ein char[] -Member hat. Ich wette, wenn Sie das durch ein const char* ersetzen, das löst Ihre Probleme, da String-Literale wahrscheinlich sowieso im nichtflüchtigen Speicher sind.

%Vor%

Oder, wenn Sie schlau sein wollen, können Sie dies zu einer Vorlage machen und sogar diese Menge an Speicher sparen (auf Kosten von etwas mehr Verwirrung. Dies hat den zusätzlichen Vorteil, dass es möglich ist um einfach static members hinzuzufügen, die auch in nichtflüchtigem Speicher sind, aber nicht nach Dateiname geteilt werden.Es ist nicht offensichtlich, aber dieses kann mit Dateien verwendet werden, deren Namen zur Laufzeit nicht bekannt sind. aber ich empfehle das nicht.

%Vor%

Wenn Sie jedoch ein geteiltes Objekt wirklich wollen, dann ist das, was Sie als Split-Vorschlag haben, wirklich die beste Antwort, die ich mir vorstellen kann.

    
Mooing Duck 12.02.2013 18:43
quelle
1

Mit einigen Einschränkungen können Sie mithilfe von Vorlagen eine statische Instanz von DataNonConst erstellen, auf die von jedem ROMable DataConst-Objekt verwiesen wird.

Einschränkungen:

  • Der Code verwendet das Makro __LINE__ . Daher darf es nur eine DataConst-Deklaration pro Zeile geben. Alternativ, wenn die __COUNT__ Makro ist verfügbar, es kann anstelle von __LINE__ verwendet werden mehrere Deklarationen pro Zeile.

  • Die DataNonConst -Objekte sind immer null-initialisiert.

Code:

%Vor%     
D Krueger 13.02.2013 20:20
quelle
0

Deklarieren Sie einfach const members static const .

static members werden in jedem Fall getrennt von den Objektinstanzdaten gespeichert. Ihr Compiler kann automatisch static const solcher Member in ROM platzieren, aber wenn nicht, gibt es wahrscheinlich Compiler-Direktiven, die das erzwingen.

    
Clifford 12.02.2013 18:30
quelle
0

Wenn Sie eine maximale Anzahl von Objekten haben möchten, können Sie Indizes als implizite Zeiger verwenden:

%Vor%

Dies bedeutet, dass Sie keinen Overhead benötigen, und Sie müssen den Flash nicht berühren, um vom RAM zu lesen. Sie verwenden auch nicht mehr die Standardspeicherverwaltung, die ein Plus oder ein Minus sein kann.

    
dspeyer 12.02.2013 19:54
quelle
0

Wenn Sie bereit sind, einen reinen Flash-Overhead zu haben, könnten Sie Folgendes tun:

%Vor%

Maps haben einen nichtgemeindlichen Overhead, aber alles ist im Flash.

    
dspeyer 12.02.2013 20:00
quelle

Tags und Links