c++ 为什么std::string的容量是15,为什么我的reserve()被忽略了?

vpfxa7rd  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(237)
#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。我不知道为什么。

zynd9foi

zynd9foi1#

快速搜索会显示:https://cplusplus.com/reference/string/string/reserve/
如果n大于目前的字串容量,函式会使容器将其容量增加到n个字符***(或更大)***。
在所有其他情况下,它被视为一个***非绑定***请求,以缩小字符串容量:容器实现***可以自由地进行其他优化,并使字符串的容量大于n。***
不保证通过调用reserve将为您提供***与您提供的***完全相同的容量

g52tjvyc

g52tjvyc2#

请注意,还

int main()
{
    std::string s;
    std::cout << s.capacity() << "\n";
    s.reserve(5);
    std::cout << s.capacity() << "\n";
}

会打印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。它也可以是其他值。

相关问题