将stl字符串缩小到小于15个字符的容量
shrinking stl string to a capacity of less than 15 characters
考虑std::string和容量
std::string aString = "12345678901234567890";
std::cout << aString.capacity() << std::endl; // capacity is 20
aString.clear();
std::cout << "size: " << aString.size() << std::endl;
std::cout << aString.capacity() << std::endl; // capacity is 20
aString.shrink_to_fit();
std::cout << aString.capacity() << std::endl; // capacity is 15?
std::string newString;
std::cout << newString.capacity() << std::endl; // capacity is 15?
15个字符是最小容量吗?有没有办法把它缩小到字符串的实际大小?
std::string
的一些实现使用"短字符串优化",该优化使用字符串本身的空间,而不是动态分配的内存来存储小字符串的内容。所以,你不能收缩字符串,因为内存是字符串本身的一部分。
这在msvc2017 basic_string实现中是不可能的,因为构造一个空的std::string
将分配至少15个字符。
更多详细信息:std::string.capacity()
返回_Myres
,表示当前分配存储的长度
// Implementation of std::string.capacity()
_NODISCARD size_type capacity() const noexcept
{ // return current length of allocated storage
return (this->_Get_data()._Myres);
}
// Construct an empty string would call _Tidy_init() method
basic_string() _NOEXCEPT_COND(is_nothrow_default_constructible_v<_Alty>)
: _Mybase()
{ // construct empty string
_Tidy_init();
}
// Moreover, initialize _Myres by enum constant value
void _Tidy_init()
{ // initialize basic_string data members
auto& _My_data = this->_Get_data();
_My_data._Mysize = 0;
_My_data._Myres = this->_BUF_SIZE - 1;
// the _Traits::assign is last so the codegen doesn't think the char
// write can alias this
_Traits::assign(_My_data._Bx._Buf[0], _Elem());
}
// _BUF_SIZE stands for literal number 16 (std::cout<<std::string::_BUF_SIZE;)
enum
{ // length of internal buffer, [1, 16]
_BUF_SIZE = 16 / sizeof (value_type) < 1 ? 1
: 16 / sizeof (value_type)};
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 将stl字符串缩小到小于15个字符的容量
- 带有多个字符分隔符的正则表达式
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 注册表正在设置 1 个字符
- 使用类 ?C++ 和 SFML 以及标题中的 15 个字符
- 如何忽略第一个字符输入后的所有内容
- std::stoi 只转换前几个字符
- 仅读取文件末尾的最后 3 个字符,并将其另存为 int
- C++字符数组不接受超过 4 个字符的输入
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 增量生成 - 错误:字符串的第一个字符应'0'或'1'
- 对于多个字符(如 ETX/STX 对),是否有类似于 std::quote 的东西
- 在函数中连接两个字符,并在 C++ 中返回输出
- 如何通过组合多个字符数组来创建字符数组?
- 对c++中的输入使用getline函数时忽略第一个字符
- 将 (*abc) + 15 未定义,因为数组只有 10 个字符长
- 如何在 C++ 中将 char 数组中的前 15 个字符转换为 std::string