Ich habe eine Funktion, die einen Eingabepuffer von n
Bytes erhält und einen Hilfspuffer von n
Bytes benötigt, um den angegebenen Eingabepuffer zu verarbeiten.Speicher mit C++ in Echtzeit vormerken
(ich weiß Vektor Speicher zur Laufzeit Zuweisung von, sagen wir mal, dass ich einen Vektor bin mit der statischen vorreservierten Speicher verwendet. Stellen Sie sich dieses ist NICHT ein STL-Vektor.)
Der übliche Ansatz ist
Da ich in einer Echtzeitumgebung arbeite, möchte ich den gesamten Speicher im Voraus reservieren, den ich jemals brauche.
Der Puffer wird nur einmal beim Start zugewiesen. Ich möchte, dass, wenn ich einen Vektor zuzuteilen, ich automatisch Auxiliary-Puffer für meine processData
-Funktion zuweisen werde.
ich etwas ähnliches mit einer Template-Funktion mit Vorlagen nicht viel Spaß
static void _processData(vector<T> &vec,vector<T> &aux) {
// process data
}
template<size_t sz>
void processData(vector<T> &vec) {
static aux_buffer[sz];
vector aux(vec.size(),aux_buffer); // use aux_buffer for the vector
_processData(vec,aux);
}
// usage:
processData<V_MAX_SIZE>(v);
Allerdings arbeiten viel tun kann, ist (jetzt wollen wir alles neu kompilieren, da ich einen Kommentar geändert!), Und es zwingt mich eine Buchhaltung zu tun wann immer ich diese Funktion nutze.
Gibt es schönere Designs für dieses Problem?
Pflicht Frage: Haben Sie profilieren Code, dass die Dynamik zu beweisen Speicherzuordnungen sind wirklich ein Problem? Ich weiß, dass jeder sagt, dass man alles für Echtzeit-Sachen vergeben sollte, aber es hängt wirklich von deinem System ab. –
Abhängig von den Anforderungen habe ich in der Vergangenheit eine vorher festgelegte Größe dynamisch zugewiesen. Vergleichen Sie dann die erforderliche Größe mit der bereits zugewiesenen Größe und weisen Sie sie neu zu, wenn nicht genügend Speicherplatz vorhanden ist. Dadurch wird sichergestellt, dass Sie immer genügend Speicherplatz haben und dass die Zuweisungen letztendlich gestoppt werden, wodurch das System stabilisiert wird. –
@Kristo: "Echtzeit" bedeutet, dass es ein Fehler ist, wenn die Verarbeitung länger als eine bestimmte Zeit dauert. Das Profiling kann nur den schlimmsten Fall anzeigen, der während eines Profillaufs aufgetreten ist, nicht der theoretisch schlimmste Fall. Die dynamische Zuweisung ist nur dann sicher, wenn der Zuordner eine Obergrenze für die benötigte Zeit garantieren kann. –