sted :: string在visual studio上的特定行为?

adr*_*ain 6 c++ stl stdstring

我有一个项目,我需要读/写大文件.

我决定使用ifstream :: read()将这些文件一次性传递到内存中,放入std :: string.(这似乎是做C++中的最快方法:http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.htmlHTTP:// 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特有的.

你能告诉我一些线索吗?

Jef*_*kin 4

正如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