Ich habe einen Thread ausgeführt, der einen Strom von Bytes von einem seriellen Anschluss liest. Es tut dies kontinuierlich im Hintergrund und liest aus dem Strom, der zu verschiedenen, getrennten Zeiten hereinkommt. Ich speichere die Daten in einem Container wie so:Verwenden von STL-Vektor als FIFO-Container für Byte-Daten
ByteVector read_bytes = serial_port->ReadBytes(100); // read 100 bytes; returns as a "ByteVector"
receive_queue.insert(receive_queue.end(), read_bytes.begin(), read_bytes.end());
Wenn ich bereit bin, zu lesen:
using ByteVector = std::vector<std::uint8_t>;
ByteVector receive_queue;
Wenn Daten kommen aus dem seriell Port, ich es bis zum Ende der Byte-Warteschlange anhänge Daten in der Warteschlange empfängt, entferne ich es von vorne:
unsigned read_bytes = 100;
// Read 100 bytes from the front of the vector by using indices or iterators, then:
receive_queue.erase(receive_queue.begin(), receive_queue.begin() + read_bytes);
Dies ist nicht der vollständige Code, sondern gibt eine gute Vorstellung davon, wie ich den Vektor für diesen Daten-Streaming-Mechanismus bin verwendet.
Mein Hauptanliegen bei dieser Implementierung ist die Entfernung von der Vorderseite, die Verschiebung jedes Element entfernt erfordert (ich bin mir nicht sicher, wie optimiert erase()
ist für Vektor, aber im schlimmsten Fall, jede Elemententfernung führt zu einer Verschiebung von der gesamte Vektor). Auf der anderen Seite sind Vektoren wegen der zusammenhängenden Natur der Daten Kandidaten für eine CPU-Cache-Lokalität (aber die CPU-Cache-Nutzung ist nicht garantiert).
Ich habe gedacht, vielleicht mit boost::circular_buffer
, aber ich bin mir nicht sicher, ob es das richtige Werkzeug für den Job ist.
Ich habe noch nicht eine obere Grenze für das Wachstum der Empfangswarteschlange codiert, jedoch konnte ich irgendwo leicht tun ein reserve(MAX_RECEIVE_BYTES)
, und stellen Sie sicher, dass size()
niemals größer als MAX_RECEIVE_BYTES
ist, wie ich auf der Rückseite davon anhängen weiter .
Ist dieser Ansatz im Allgemeinen in Ordnung? Wenn nicht, welche Leistungsbedenken gibt es? Welcher Container wäre hier angemessener?
"aber das ist nicht garantiert". Ich glaube es ist. – Barmar
Verwenden Sie std :: deque. –
@Barmar Nicht nach dem C++ - Standard. Um es klar zu sagen: Ich beziehe mich auf die Fähigkeit, die Array-Daten im CPU-Cache zu speichern, und nicht auf die Anforderung, dass Vektordaten zusammenhängend sind. –