代码之家  ›  专栏  ›  技术社区  ›  dreamlax

用于字符串的容量值

  •  13
  • dreamlax  · 技术社区  · 15 年前

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

    7 回复  |  直到 15 年前
        1
  •  10
  •   Marcelo Cantos    15 年前

    你更有可能使用 reserve() 成员函数,其中 集合 至少达到所提供值的容量。

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

        2
  •  6
  •   Viktor Sehr    15 年前

    这个 string::capacity() 函数返回 std::string 可能包含在必须重新分配内存之前,这是一个相当昂贵的操作。

    std::vector 以同样的方式工作,所以我建议你查一下 STD::载体 here 详细解释已分配内存和已初始化内存之间的区别。

    更新

    嗯,我看我误解了这个问题,事实上我认为我从未在std::string或std::vector上使用过capacity(),似乎有任何原因,因为无论如何你都必须调用reserve。

        3
  •  3
  •   anon    15 年前

    它给出了字符串可以包含的字符数,而无需重新分配。我认为在分配代价高昂的情况下,这可能很重要,您希望避免这种情况,但我必须说,这是一个字符串成员函数,我从未在真正的代码中使用过。

        4
  •  2
  •   Péter Török    15 年前

    如果要向字符串中添加大量字符,则可以使用它进行一些性能优化。在开始字符串操作之前,您可以检查容量,如果容量太小, reserve 在一个步骤中所需的长度(而不是让它连续几次重新分配更大的内存块,这将是一个性能消耗)。

        5
  •  2
  •   Jonathan M Davis    15 年前

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

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

    向量函数与相同函数的基本相同。

    就我个人而言 capacity() 预留() 对于Vector,我从来没有见过需要对字符串做这么多操作——可能是因为我在代码中通常没有做足够多的字符串连接来使它值得。在大多数情况下,一个特定的字符串可能会得到一些连接,但不足以担心它的容量。当您试图优化代码时,通常会担心容量问题。

        6
  •  1
  •   MSalters    15 年前

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

        7
  •  1
  •   please delete me    15 年前

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

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

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

    猜猜看, 一串 最初的目的可能是作为 矢量 但随着时间的推移,两人逐渐分开…

    推荐文章