我有一个项目,我需要读/写大文件.
我决定使用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/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)
Run Code Online (Sandbox Code Playgroud)
但是,在Visual Studio 2008下,这并没有释放std :: string本身内部使用的内存:它的底层缓冲区没有被解除分配.
我发现删除它的唯一方法是调用std :: string :: swap(std :: string(""))强制更改实际std :: string和param中的空缓冲区之间的内部缓冲区.
我觉得这个行为有点奇怪......
我只在Visual Studio 2008上测试过,我不知道它是否是STL标准行为,或者它是否是MSVC特有的.
你能告诉我一些线索吗?
正如Vlad和Alf评论的那样,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 <= size() 的调用实际上是一个非绑定的收缩以适应请求。
这意味着实施更有可能释放通话容量reserve()。如果我没看错的话,当您调用 时, libc++reserve(0)和 libstdc++ 会释放空间,但 VC++ 的库做出相反的选择似乎是合理的。
编辑:正如佩内洛普所说,这里的行为往往与的行为std::string完全相同。std::vector
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |