hyp*_*not 10 c++ string gcc istream visual-studio
我想把一个文件读成一个字符串.我正在寻找有效的方法.
使用固定大小的*char缓冲区
我收到了Tony 的回答是什么创建了一个16kb的缓冲区并读入该缓冲区并附加缓冲区,直到没有其他内容可读.我理解它是如何工作的,我发现它非常快.我不明白的是,在答案的评论中,据说这种方式将所有内容复制两次.但据我所知,它只发生在内存中,而不是发生在磁盘上,所以它几乎是不可察觉的.它是从缓冲区复制到内存中的字符串的问题吗?
使用istreambuf_iterator
我收到的另一个答案是使用istreambuf_iterator.代码看起来美观而且极小,但速度极慢.我不知道为什么会这样.为什么那些迭代器这么慢?
使用memcpy()
对于这个问题,我收到的评论是我应该使用memcpy(),因为它是最快的本机方法.但是如何将memcpy()与字符串和ifstream对象一起使用?是不是ifstream应该使用自己的读取功能?为什么使用memcpy()破坏可移植性?我正在寻找与VS2010以及GCC兼容的解决方案.为什么memcpy()不适用于那些?
+还有其他任何有效的方法吗?
对于小的<10 MB二进制文件,你推荐什么,我使用什么shell?
(我不想将这个问题分成几部分,因为我对如何将ifstream读入字符串的不同方式之间的比较更感兴趣)
Kon*_*lph 10
它只发生在内存中,而不是发生在磁盘上,因此几乎不可察觉
这确实是正确的.不过,不这样做的解决方案可能会更快.
为什么那些迭代器这么慢?
代码很慢,不是因为迭代器,而是因为字符串不知道要分配多少内存:istreambuf_iterators只能遍历一次,因此字符串基本上被强制执行重复连接,结果是内存重新分配,这非常慢.
我最喜欢的单行,另一个答案是直接从底层缓冲区流式传输:
string str(static_cast<stringstream const&>(stringstream() << in.rdbuf()).str());
Run Code Online (Sandbox Code Playgroud)
在最近的平台上,这确实会预先分配缓冲区.但是它仍然会产生冗余副本(从stringstream最终字符串到最终字符串).
| 归档时间: |
|
| 查看次数: |
12344 次 |
| 最近记录: |