了解std :: string的效率

flu*_*mpb 6 c++ string performance construction

我正在尝试学习更多关于c ++字符串的知识.

考虑

const char* cstring = "hello";
std::string string(cstring);
Run Code Online (Sandbox Code Playgroud)

std::string string("hello");
Run Code Online (Sandbox Code Playgroud)

假设在应用程序的.data部分中存储"hello",然后将字节复制到堆上的另一个区域,由std :: string管理的指针可以访问它们,我是否正确?

我怎么能有效地存储一个非常长的字符串?我正在考虑从套接字流中读取数据的应用程序.我担心连续多次.我可以想象使用链表并遍历此列表.

弦乐已经吓倒了我太久了!

任何链接,提示,解释,进一步的细节,将非常有帮助.

Eri*_* Pi 3

我已经将字符串存储在 10 或 100 MB 范围内,没有任何问题。当然,它将主要受到可用(连续)内存/地址空间的限制。

如果您要追加/连接,有一些事情可能有助于提高效率:如果可能,尝试使用reserve()成员函数来预分配空间——即使您粗略地知道如何分配空间。最终大小可能很大,随着字符串的增长,它可以避免不必要的重新分配。

此外,许多字符串实现使用“指数增长”,这意味着它们以一定百分比增长,而不是固定字节大小。例如,每当需要额外空间时,它可能只是将容量加倍。通过以指数方式增加大小,执行大量串联变得更加有效。(具体细节取决于您的 stl 版本。)

最后,另一种选择(如果您的库支持)是使用Rope<>模板:绳索与字符串类似,只不过它们在对非常大的字符串执行操作时效率更高。特别是,“绳索以小块的形式分配,显着减少了大块引入​​的内存碎片问题”。有关SGI 的 STL 指南的一些附加详细信息。