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 ++标准是否保证不会引起分配?
首先请注意,标准通常设定要求而不是保证。
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。
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |