Zunächst möchte ich sagen, dass ich Software für Mikrocontroller entwickle, daher ist RAM-Nutzung wichtig und es macht Sinn, große Blöcke von const Daten in nichtflüchtigen (Flash) Speicher zu setzen.Gibt es eine nette Möglichkeit, "Split-Objekt" in C++ zu erstellen?
Was ich versuche zu erreichen, ist eine schöne Möglichkeit zu finden, ein "Split" -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, dass "receipt" eine lange Zeichenfolge ist, die ein Dateiname ist und das Medium, auf das es zeigt, langsam ist. Daher ist es sinnvoll, das einzelne Byte im Speicher zu puffern, anstatt es bei jeder Anforderung zu lesen.
class Data
{
uint8_t byte;
bool valid;
const char filename[128];
uint8_t read()
{
if (!valid)
performReallySlowRead(filename, &byte);
valid = true;
return byte;
};
void write(uint8_t new_value)
{
byte = new_value;
performRealWriteToMedia(filename, byte);
valid = true;
};
}
Das offensichtliche Problem bei diesem Ansatz ist, dass ganze 130-Byte RAM enden, während nur zwei von ihnen geändert werden müssen. So habe ich mit einer Idee von Split-Objekt kommen:
class DataNonConst
{
uint8_t byte;
bool valid;
}
class DataConst
{
const char filename[128];
DataNonConst * const data;
}
static DataNonConst storage;
const DataConst holder("some_long_name_here", &storage);
nun das einzige Problem ist, dass, wenn ich ein paar hundert solcher haben möchte Split-Objekte den Prozess, sie schaffen (so TWO Schaffung Objekte und Verknüpfen von Sekunde zu Anfang) wird ziemlich langweilig und problematisch ...
Also die Frage ist - gibt es eine nette Möglichkeit, es einfacher zu verwenden, vorzugsweise eine clevere C++ - Trick oder vielleicht eine Vorlage 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 führen in großer Vorlage aufblasen ...
EDIT:
Eigentlich Teil des ganzen Problems kann auf eine einfachere Frage reduziert werden - ist es eine Möglichkeit, zu „binden“ eine anonyme Variable ein Mitgliedsfeld in C++? Sth wie:
const ConstData holder("...", NonConstData()); // this object HAS TO be ROMable
In dem oben "Wunschdenken" holder ist konstantes Objekt in ROM und es hat einen Zeiger/reference/was auch immer an ein anonymes Objekt NonConstData erstellt "irgendwo" im RAM. Oder:
std:pair<const ConstData &, NonConstData &> holder(ConstData(), NonConstData());
Alles, was mir nicht manuell erlauben würde, um beide Objekte zu erstellen und einem zum anderen binden.
Was in Halter für Konstanz erforderlich? – Ation
Um es ROMable machen, so dass es in nichtflüchtigem Speicher, nicht im RAM platziert werden würde. Dies ist sehr wichtig für das Thema ... –
In Bezug auf die Makrolösung - konnten Sie nicht den Namen des Speicherobjekts als Argument für das Makro übergeben? –