我想将文件读入字符串。我正在寻找不同的方法来有效地做到这一点。
使用固定大小的 *char 缓冲区
我收到了answer来自 Tony 的内容创建了一个 16 kb 缓冲区并读取该缓冲区并追加该缓冲区,直到没有更多内容可读取。我了解它是如何工作的,并且很快就找到了它。我不明白的是,在该答案的评论中据说这种方式将所有内容复制两次。但据我了解,它只发生在内存中,而不是从磁盘中发生,所以它几乎是不可察觉的。它从缓冲区复制到内存中的字符串是否有问题?
使用 istreambuf_iterator
The 其他答案我收到了使用 istreambuf_iterator 的信息。代码看起来很漂亮而且很简洁,但是速度非常慢。我不知道为什么会这样。为什么这些迭代器这么慢?
使用 memcpy()
For 这个问题我收到的评论说我应该使用 memcpy(),因为它是最快的本机方法。但是如何将 memcpy() 与字符串和 ifstream 对象一起使用? ifstream 不应该使用它自己的读取功能吗?为什么使用 memcpy() 会破坏可移植性?我正在寻找一个与 VS2010 以及 GCC 兼容的解决方案。为什么 memcpy() 不能与这些一起使用?
+ 还有其他有效的方法吗?
对于
(我不想将这个问题分成几部分,因为我更感兴趣的是如何将 ifstream 读入字符串的不同方式之间的比较)
它只发生在内存中,而不是从磁盘中发生,因此几乎不易察觉
这确实是正确的。不过,不这样做的解决方案可能会更快。
为什么这些迭代器这么慢?
代码很慢不是因为迭代器,而是因为字符串不知道要分配多少内存:istreambuf_iterator
s 只能遍历一次,因此字符串本质上被迫执行重复连接,从而导致内存重新分配,这是非常慢的。
我最喜欢的一句台词,来自另一个答案直接从底层缓冲区流式传输:
string str(static_cast<stringstream const&>(stringstream() << in.rdbuf()).str());
在最近的平台上,这确实会预先分配缓冲区。然而,它仍然会导致冗余副本(来自stringstream
到最后的字符串)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)