c++ - std::string 什么时候重新分配内存?

标签 c++ stdstring

当使用 std::string 对象并且我想向它添加字符时,它会预先分配一些内存,还是只分配我需要的内存?

准确地说:

 std::string s;
 s.reserve(20);
 char c = 'a';
 s = "";
 for(int i = 0; i < 25; i++)
    s += c;

在上面的例子中,我预留了一定量的内存。现在当我清除字符串时,是否会导致保留的内存被丢弃? 在循环中它会填满预留内存然后每次重新分配额外的 5 个字符吗?

最佳答案

没有要求 std::string 在您分配一个空字符串给它时释放分配的内存。当您为其分配一个短字符串时也不会。唯一的要求是,当它分配内存以容纳更大的字符串时,分配必须以实现摊销常数时间的方式进行。一个简单的实现是每次需要更多空间时增长 2 倍。

如果希望字符串的容量最小化,可以在 C++11 中使用 string::shrink_to_fit()。在 C++11 之前,有些人在需要减少容量时诉诸“交换技巧”。

关于c++ - std::string 什么时候重新分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25974085/

相关文章:

C++ 确定是否在不定义预处理器符号的情况下使用调试符号进行编译

c++ - 为什么 emplace_back ("Hello") 调用 strlen?

c++ - 将 C++ std::string 转换为 UTF-16-LE 编码的字符串

c++ - OpenCV:如何迭代图像特定区域中的每个像素

c++ - 请求从 'std::string' 到非标量类型的转换

c++ - 固定大小字符串类的最佳实践

c++ - 没有匹配的函数来调用 basic_string::copy

php - 尝试使用 CURL 从 C++ 上传文件到 PHP

C++流、函数声明等问题

c++ - 从集合 vector 中删除集合