如果new_size不大于旧值,C ++标准是否保证std :: string :: resize(new_size)不会导致分配?

xml*_*lmx 5 c++ string performance standards memory-management

#include <string>
#include <cassert>

int main()
{
    auto s = "hello"s;
    auto p = &s[0];

    s.resize(3);
    assert('h' == *p); // always ok?
}
Run Code Online (Sandbox Code Playgroud)

std::string::resize(new_size)如果++ new_size不大于旧的标准,C ++标准是否保证不会引起分配?

Max*_*kin 4

首先请注意,标准通常设定要求而不是保证。

std::basic_string::resizeresize如果参数小于当前字符串,则不需要不重新分配字符串size()。事实上,C++17 标准说当前字符串被新字符串替换:

如果n <= size(),则该函数将 指定的字符串替换为*this长度为 的字符串,n 该字符串的元素是 指定的原始字符串的初始元素的副本*this

当使用小字符串优化时,调整为较小的大小可能会导致字符串就地存储字符,而不是动态分配的缓冲区中。


在C++20标准resize制定后constexpr,上面的措辞消失了,参见string.capacity

constexpr void resize(size_type n, charT c);

5 #Effects:更改值*this如下:

(5.1) 如果n <= size(),则删除最后一个size() - n元素。

(5.2) 如果n > size(),则附加n - size()的副本c