用于字符串的容量值

时间:2010-05-21 11:12:49

标签: c++ string allocator capacity

在C ++标准库中,std::string有一个公共成员函数capacity(),它返回内部分配存储的大小,一个大于或等于字符串中字符数的值(根据到here)。这个值可以用于什么?它与自定义分配器有关吗?

7 个答案:

答案 0 :(得分:10)

您更有可能使用reserve()成员函数,容量设置为至少提供的值。

capacity()成员函数本身可能用于避免分配内存。例如,您可以通过池回收使用过的字符串,并根据其容量将每个字符串放在不同大小的存储桶中。然后,池的客户端可以请求已经具有一些最小容量的字符串。

答案 1 :(得分:6)

string::capacity()函数返回std::string在重新分配内存之前可能包含的总字符数,这是一项非常昂贵的操作。

std::vector的工作方式相同,因此我建议您查找std::vector here,详细说明已分配和已初始化内存之间的差异。

<强> 更新

嗯,我可以看到我误解了这个问题,实际上我认为我从未在std :: string或std :: vector上使用过capacity(),似乎很少有任何理由,因为你必须要调用reserve

答案 2 :(得分:3)

它为您提供字符串可以包含的字符数,而无需重新分配。我认为这在分配费用昂贵的情况下可能很重要,并且你想避免它,但我必须说这是一个我从未在实际代码中使用过的字符串成员函数。

答案 3 :(得分:2)

如果您要在字符串中添加大量字符,它可用于某些性能调整。在开始字符串操作之前,您可以检查容量,如果它太小,reserve只需一步完成所需的长度(而不是让它连续多次重新分配更大的内存块,这将是一个性能猪)。

答案 4 :(得分:2)

字符串具有容量和大小。容量表示字符串在分配更多内存之前可以容纳的字符数。大小表示当前持有的字符数。 reserve()可用于设置字符串的最小容量(它将为分配内存,至少该字符数,但可以分配更多)。

如果您增加字符串的大小,这一点非常重要。当您使用+=append()连接到字符串时,给定字符串中的字符将添加到当前字符串的末尾。如果将字符串增加到该大小不超过容量,那么它将使用它具有的容量。但是,如果新大小超过当前容量,则字符串必须在内部重新分配内存并将其内部复制到新内存中。如果你要做那么多,它可能会变得昂贵(虽然它是在摊销的常量时间内完成的),所以在这种情况下,你可以使用reserve()预分配足够的内存来减少重新分配的频率必须发生。

矢量函数的功能基本相同,具有相同的功能。

就个人而言,虽然我不时地用向量处理capacity()reserve(),但我从未见过用字符串做太多的事情 - 可能是因为我一般不做我的代码中有足够的字符串连接值得它。在大多数情况下,特定的字符串可能会有一些串联但不足以担心其容量。在尝试优化代码时,通常会担心容量问题。

答案 5 :(得分:1)

几乎没有任何相关用途。它类似于std :: vector :: capacity。但是,字符串最常见的用途之一是赋值。分配给std :: string时,其.capacity可能会更改。这意味着实现有权忽略旧容量并准确分配足够的内存。

答案 6 :(得分:1)

它真的不是很有用,可能只有vector的对称性(假设两者都以相同的方式在内部运作)。

保证向量的容量会影响调整大小的行为。将向量调整为小于或等于容量的值不会导致重新分配,因此不会使引用向量中元素的迭代器或指针无效。这意味着您可以通过在向量上调用reserve来预先分配一些存储,然后(小心)通过调整大小或推回(等)来向其添加元素,安全地知道底层缓冲区不会移动。

string没有这样的保证。似乎容量仅用于提供信息 - 尽管这是一个延伸,因为它看起来似乎没有任何有用的信息可以从中获取。 (更糟糕的是,字符串字符的连续性也不能保证,因此你可以将字符串作为线性缓冲区的唯一方法是c_str() - 这可能会导致重新分配。)

据猜测,string大概原本打算作为vector的某种特殊情况实施,但随着时间的推移,两者分开......