我有一个项目需要读取/写入大文件。
我决定使用 ifstream::read() 将这些文件一次性放入内存中,放入 std::string 中。
(这似乎是在 C++ 中执行此操作的最快方法:http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html and
http://insanecoding.blogspot.com/2011/11/reading-in-entire-file-at-once-in-c.html http://insanecoding.blogspot.com/2011/11/reading-in-entire-file-at-once-in-c.html)
在文件之间切换时,我需要“重置”用作先前内存缓冲区的 std::string (即擦除 char[] 缓冲区以释放内存)
我试过 :
std::string::clear()
std::string::assign("")
std::string::erase(0, std::string::npos)
std::string::resize(0)
std::string::reserve(0)
但是,在 Visual Studio 2008 下,这不会释放 std::string 本身内部使用的内存:其底层缓冲区不会被取消分配。
我发现删除它的唯一方法是调用 std::string::swap(std::string(""))
强制更改实际 std::string 和 param 中的空缓冲区之间的内部缓冲区。
我觉得这个行为有点奇怪......
我只在 Visual Studio 2008 上进行了测试,我不知道这是 STL 标准行为还是 MSVC 特定的行为。
你能给我一些线索吗?
正如弗拉德和阿尔夫评论的那样,std::string().swap(the_string)
是C++98的发布方式the_string
的容量,以及the_string.shrink_to_fit()
是C++11方式。
至于为什么clear()
, erase()
, resize()
等不要这样做,这是一种优化,可以减少反复使用字符串时的分配。如果clear()
释放字符串的容量,您通常必须在下一次迭代中重新分配类似数量的空间,这将需要一些时间,实现可以通过保留容量来节省。标准不保证这种实现,但它在实现中很常见。
reserve()
记录有
使用小于capacity()的res_arg参数调用reserve()实际上是一个非约束收缩请求。使用 res_arg
这意味着实施更有可能释放reserve()
称呼。如果我没读错的话libc++ http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/string?view=markup当你调用时 libstdc++ 会释放空间reserve(0)
,但 VC++ 库做出相反的选择似乎是合理的。
编辑:正如佩内洛普所说,std::string
在这里的行为往往与std::vector
的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)