#include <iostream> #include <string> using namespace std; int main() { string s; s.reserve(5); cout << s.capacity() << endl; }
reserve是std::string的一个函数,用于设置容量。capacity函数显示了std::string中c_string的空间大小。但是,结果不是5,而是15。我不知道为什么。
zynd9foi1#
快速搜索会显示:https://cplusplus.com/reference/string/string/reserve/如果n大于目前的字串容量,函式会使容器将其容量增加到n个字符***(或更大)***。在所有其他情况下,它被视为一个***非绑定***请求,以缩小字符串容量:容器实现***可以自由地进行其他优化,并使字符串的容量大于n。***不保证通过调用reserve将为您提供***与您提供的***完全相同的容量
reserve
g52tjvyc2#
请注意,还
int main() { std::string s; std::cout << s.capacity() << "\n"; s.reserve(5); std::cout << s.capacity() << "\n"; }
会打印15两次。请考虑此命令的输出
15
#include <iostream> #include <string> int main() { std::string s; std::cout << s.capacity() << "\n"; std::cout << sizeof(std::string) << "\n"; std::cout << sizeof(char) << "\n"; std::cout << sizeof(char*) << "\n"; std::cout << sizeof(size_t) << "\n"; }
Possible output:
15 32 1 8 8
一个std::string必须存储字符数组,它的大小,容量,也许还有一些簿记。(对于恒定时间size()和其它,仅空终止符是不够的)。然而,也就是16个字节。一个字符只有1个字节。因此,在分配任何动态内存之前,空的std::string有足够的空间来存储一些字符,因为一旦字符串增长,就可以重用用于其他内容的内存。这是短字符串优化。我只是概述了一般的想法。详细信息我请您参考其他资源或实现。进一步的reserve(n)只会确保字符串有足够的空间来存储至少n个字符。空字符串已经有足够的空间来存储5个字符。当n小于当前容量时,字符串可能会收缩或不收缩(从C++20开始就不会)。TL;DR:您对reserve的调用不会被忽略。调用后,字符串的容量足以容纳5个字符。您的实现的初始容量似乎是15。它也可以是其他值。
std::string
size()
reserve(n)
n
2条答案
按热度按时间zynd9foi1#
快速搜索会显示:https://cplusplus.com/reference/string/string/reserve/
如果n大于目前的字串容量,函式会使容器将其容量增加到n个字符***(或更大)***。
在所有其他情况下,它被视为一个***非绑定***请求,以缩小字符串容量:容器实现***可以自由地进行其他优化,并使字符串的容量大于n。***
不保证通过调用
reserve
将为您提供***与您提供的***完全相同的容量g52tjvyc2#
请注意,还
会打印
15
两次。请考虑此命令的输出
Possible output:
一个
std::string
必须存储字符数组,它的大小,容量,也许还有一些簿记。(对于恒定时间size()
和其它,仅空终止符是不够的)。然而,也就是16个字节。一个字符只有1个字节。因此,在分配任何动态内存之前,空的std::string
有足够的空间来存储一些字符,因为一旦字符串增长,就可以重用用于其他内容的内存。这是短字符串优化。我只是概述了一般的想法。详细信息我请您参考其他资源或实现。
进一步的
reserve(n)
只会确保字符串有足够的空间来存储至少n
个字符。空字符串已经有足够的空间来存储5个字符。当n
小于当前容量时,字符串可能会收缩或不收缩(从C++20开始就不会)。TL;DR:您对
reserve
的调用不会被忽略。调用后,字符串的容量足以容纳5个字符。您的实现的初始容量似乎是15。它也可以是其他值。