Chciałbym przeczytać plik na ciąg. Szukam różnych sposobów, jak to zrobić skutecznie.Jak korzystać z istream ze stringami
Korzystanie stały rozmiar bufora * char
Otrzymałem answer z Tonym co tworzy bufor A 16 kb i czyta w tym buforze i dołącza do bufora nie ma nic więcej do czytania. Rozumiem, jak to działa i znalazłem to bardzo szybko. Nie rozumiem, że w komentarzach tej odpowiedzi mówi się, że w ten sposób wszystko kopiuje się dwa razy. Ale jak rozumiem, dzieje się to tylko w pamięci, nie z dysku, więc jest prawie niezauważalne. Czy problem polega na tym, że kopiuje z bufora na ciąg w pamięci?
Korzystanie istreambuf_iterator
The other answer otrzymałem wykorzystuje istreambuf_iterator. Kod wygląda pięknie i minimalnie, ale jest bardzo powolny. Nie wiem, dlaczego tak się dzieje. Dlaczego te iteratory są takie powolne?
Korzystanie memcpy()
Dla this question dostałam komentarze, które powinno się używać memcpy(), ponieważ jest to najszybsza metoda naturalnej. Ale w jaki sposób mogę użyć memcpy() z łańcuchem i obiektem ifstream? Czy ifstream nie powinien pracować z własną funkcją odczytu? Dlaczego używanie przenośności memcpy() jest niemożliwe? Szukam rozwiązania zgodnego z VS2010 i GCC. Dlaczego funkcja memcpy() nie będzie z nimi współpracować?
+ Czy jest jakaś inna skuteczna metoda?
Co polecasz, z której powłoki korzystam, w przypadku małych plików binarnych o wielkości 10 MB, <?
(nie chciałem podzielić to pytanie w części, jak ja jestem bardziej zainteresowany w porównaniu między inny sposób w jaki mogę odczytać ifstream na sznurku)
Komentarz memcpy() odnosi się do odczytu za pomocą pliku mapowanego w pamięci, a nie do odczytu za pomocą istream. Plik mapowany w pamięci nie jest przenośny, ponieważ zależy od interfejsu API systemu operacyjnego. – Dikei
Kiedy mierzysz wydajność, robisz to w trybie zwolnienia lub debugowania? Czy włączasz optymalizacje? Czy sprawdzanie iteratora jest wyłączone? Domyślnie studio wizualne ma niestandardowy iterator sprawdzający, czy może to zaszkodzić wydajności. – luke
możliwy duplikat [jak wstępnie przydzielić pamięć dla obiektu std :: string] (http://stackoverflow.com/questions/3303527/how-to-pre-allocate-memory-for-a-stdstring-object/ 3304059 # 3304059)? Być może najbardziej dokładny duplikat jaki widziałem. Całe pierwsze zdanie jest praktycznie identyczne (jedyna różnica to "muszę ..." a "chciałbym ...") –