Wie zu verwenden istream mit strings

Möchte ich zum Lesen einer Datei in einen string. Ich bin auf der Suche nach verschiedenen Möglichkeiten, wie es zu tun effizient.

Mit einer festen Größe *char Puffer

Ich habe eine Antwort von Tony was erstellt einen 16-kb-Puffer und liest sich in die Puffer und fügt den Puffer, bis es nichts mehr zu Lesen. Ich verstehe, wie es funktioniert und ich fand es sehr schnell. Was ich nicht verstehe ist, dass in den Kommentaren der Antwort wird es gesagt, dass auf diese Weise kopiert alles doppelt. Aber so wie ich es verstehe, es passiert nur im Speicher, nicht von der Festplatte, so ist es fast unnoticable. Ist es ein problem, dass es Kopien aus dem Puffer auf den string im Speicher?

Mit istreambuf_iterator

Den andere Antwort erhielt ich verwendet istreambuf_iterator. Der code sieht schön aus und minimal, aber es ist extrem langsam. Ich weiß nicht, warum geschieht es. Warum sind diese Iteratoren so langsam?

Mit memcpy()

Für diese Frage erhielt ich Kommentare, die ich verwenden soll, memcpy (), da es die Schnellste native Methode. Aber wie kann ich mit memcpy() mit einem string-und einem ifstream-Objekt? Nicht ifstream funktionieren soll mit seinen eigenen read-Funktion? Warum nicht mit memcpy (), Ruine Portabilität? Ich bin auf der Suche nach einer Lösung, die kompatibel ist mit VS2010 sowie GCC. Warum würde memcpy() nicht mit denen arbeiten?

+ Andere effiziente Art und Weise möglich?

Was empfehlen Sie, was muss ich verwenden, für kleine < 10 MB Binär-Dateien?

(Ich habe nicht teilen möchten, auf diese Frage in teilen, wie ich bin mehr daran interessiert, den Vergleich zwischen den unterschiedlichen Weg, wie kann ich Lesen ifstream in einen string)

  • memcpy() Kommentar bezieht sich auf das Lesen mittels memory-mapped-Datei nicht Lesen mit istream. Memory-mapped-Datei ist nicht tragbar, weil es hängt davon ab, OS-API.
  • Wenn Sie die Messung der Leistung, tun Sie es in der release-oder debug-Modus? Sie haben Optimierungen einschalten? Sie haben iterator-überprüfung ausgeschaltet ist? Standardmäßig visual studio hat extra-standard-iterator überprüfen, die können die Leistung beeinträchtigen.
  • möglich, Duplikat der wie vorab reservieren Sie Speicher für ein std::string-Objekt? Vielleicht die genaue doppelte habe ich noch nicht gesehen. Der gesamte erste Satz ist praktisch identisch (der einzige Unterschied ist, dass "ich muss..." gegen "ich möchte...")
InformationsquelleAutor hyperknot | 2011-06-28
Schreibe einen Kommentar