Internen Puffer für Standard-Streams mithilfe von pubsetbuf festlegen
Problem:
Bei einem Versuch Beim Schreiben von Daten in einen vorhandenen Puffer mithilfe eines Stringstreams verwendete ein Programmierer ursprünglich Copy, um den Stream-Inhalt in den Puffer zu übertragen, um übermäßige Datenmengen zu vermeiden Kopieren. Anschließend versuchten sie, dies mit streambuf::pubsetbuf() zu erreichen, stellten jedoch fest, dass dadurch der Puffer unter der Visual Studio 2008 C-Standardbibliotheksimplementierung nicht geändert wurde.
Antwort:
Bei weiteren Untersuchungen stellte sich heraus, dass die pubsetbuf-Methode in der gegebenen Bibliotheksimplementierung im Wesentlichen ein No-Op war. Um einen Stream so zu konfigurieren, dass er in einen bestimmten Puffer schreibt, wird die Verwendung einer benutzerdefinierten std::streambuf-Klasse empfohlen:
template <typename char_type> struct ostreambuf : public std::basic_streambuf<char_type, std::char_traits<char_type>> { ostreambuf(char_type* buffer, std::streamsize bufferLength) { setp(buffer, buffer + bufferLength); } };
Dieser benutzerdefinierte Stream-Puffer initialisiert seine Interna, um auf den bereitgestellten Puffer zu verweisen. Um es zu verwenden:
ostreambuf<char> ostreamBuffer(buffer, size); std::ostream messageStream(&ostreamBuffer); messageStream << "Hello" << std::endl; messageStream << "World!" << std::endl;
Dieser Ansatz ermöglicht das direkte Schreiben in einen externen Puffer mithilfe der IOStream-Bibliothek und std::ostream und umgeht so das unnötige Kopieren, das mit der anfänglichen Kopiermethode verbunden ist.
Das obige ist der detaillierte Inhalt vonWie kann ich mit C-Standard-Streams effizient in einen vorab zugewiesenen Puffer schreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!