我想将文件读入字符串。我正在寻找不同的方法来有效地做到这一点。如何使用带字符串的istream
使用固定大小的*字符缓冲区
我收到了托尼一个answer什么创造一个16 KB缓冲区,并读取到该缓冲区,并附加缓冲,直到有没有更多的阅读。我明白它是如何工作的,我发现它非常快。我不明白的是,在这个答案的评论中说,这种方式复制一切两次。但据我了解,它只发生在记忆中,而不是来自磁盘,所以它几乎不可感知。它是从缓冲区复制到内存中的字符串的问题吗?
使用istreambuf_iterator
我收到的other answer使用istreambuf_iterator。代码看起来很漂亮,很小,但速度非常慢。我不知道为什么会发生。为什么这些迭代器如此缓慢?
使用的memcpy()
对于this question我收到了,我应该使用memcpy(),因为它是最快的本地方法的意见。但是,我怎样才能使用memcpy()与一个字符串和一个ifstream对象? ifstream是否应该使用自己的读取函数?为什么使用memcpy()破坏可移植性?我正在寻找一个与VS2010以及GCC兼容的解决方案。为什么memcpy()不能与这些工作?
+还有其他有效的方法吗?
你有什么建议,我使用什么shell,对于小的< 10 MB的二进制文件?
(我不想拆零件这个问题,因为我更感兴趣的是不同方式之间的比较,我怎么能读一个ifstream的成字符串)
memcpy()注释是指使用内存映射文件进行读取,而不是使用istream进行读取。内存映射文件不可移植,因为它依赖于OS API。 – Dikei
当你测量性能时,你是在释放还是调试模式下进行测试?你有优化吗?你有关闭迭代器检查吗?默认情况下,visual studio有额外的标准迭代器检查,可能会损害性能。 – luke
[如何预先为std :: string对象分配内存]的可能重复(http://stackoverflow.com/questions/3303527/how-to-pre-allocate-memory-for-a-stdstring-object/ 3304059#3304059)?也许是我看过的最精确的重复。整个第一句话实际上是相同的(唯一的区别是“我需要......”与“我想...”) –