理解std::string的效率

Understanding the efficiency of an std::string

本文关键字:效率 string 理解 std      更新时间:2023-10-16

我想多学一点c++字符串。

考虑
const char* cstring = "hello";
std::string string(cstring);

std::string string("hello");

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

如何有效地存储一个非常非常长的字符串?我正在考虑一个从套接字流中读取数据的应用程序。我害怕多次连接。我可以想象使用一个链表并遍历这个链表。

字符串让我害怕太久了!

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

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

如果您打算追加/连接,有一些事情可能有助于提高效率:如果可能的话,尝试使用reserve()成员函数来预分配空间——即使您对最终大小可能有一个粗略的概念,它也可以在字符串增长时节省不必要的重新分配。

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

最后,另一个选择(如果你的库支持的话)是使用rope<>模板:rope与字符串类似,除了在非常大的字符串上执行操作时它们更有效。特别是,"rope以小块分配,显著减少了大块带来的内存碎片问题"。

由于您是从套接字读取字符串,因此您可以重用相同的数据包缓冲区并将它们链接在一起以表示大字符串。这将避免任何不必要的复制,并且可能是最有效的解决方案。我好像记得ACE库提供了这样一种机制。我想办法找到它。

EDIT: ACE有ACE_Message_Block,允许您以链表方式存储大消息。你几乎需要阅读c++网络编程书籍来理解这个庞大的库。ACE网站上的免费教程真的很烂。

我打赌是Boost。Asio必须能够做与ACE的消息块相同的事情。提振。Asio现在似乎比ACE拥有更大的思想份额,所以我建议在Boost中寻找解决方案。Asio第一。如果有人能给我们点启发。Asio解决方案,那将是伟大的!


是时候尝试使用Boost编写一个简单的客户机-服务器应用程序了。

我认为效率不应该是问题。两者都足够好。

这里的决定因素是封装。std::string是一个比char *更好的抽象。封装指针运算是件好事。

很多人花了很长时间才想出了std::string。我认为出于毫无根据的效率原因而不使用它是愚蠢的。坚持更好的抽象和封装。

您可能知道,std::string实际上只是basic_string<char>的另一个名称。

也就是说,它们是一个序列容器,内存将按顺序分配。如果您试图使一个字符串大于您可以分配的可用连续内存,则可能会从std::string中获得异常。由于内存碎片,该阈值通常远远小于可用内存总量。

在尝试分配连续内存时,我看到了分配连续内存的问题,例如,为图像分配大型连续3D缓冲区。但是这些问题至少在100MB左右不会出现,至少在我的经验中,在Windows XP Pro(例如)上。

你的字符串有这么大吗?