std :: basic_string构造函数如何预先知道要保留多少空间?

Joh*_*and 3 c++ stdstring c++11

std::basic_string具有以下构造函数,该构造函数使用以下指向的以null结尾的字符串的内容初始化字符串s:

std::basic_string(const CharT* s, const Allocator& alloc = Allocator());
Run Code Online (Sandbox Code Playgroud)

但是构造函数如何事先知道为其内部缓冲区中的字符串保留多少空间?

我可以想到两种方法:

1)它可以首先遍历整个以null结尾的字符串,直到它找到第一个NULL字符,记住它遍历了多少个字符,并将其用作其内部缓冲区的容量并开始复制.

缺点:它必须读取字符串两次,一次用于计算字符,第二次用于复制字符串.

2)它可以在其内部缓冲区中保留一个保守的数量,然后开始复制.如果它击中NULL字符缓冲区用完之前,我们就好了,否则我们需要(一个保守量再次)预留更多的空间,然后重复上述步骤.

缺点:如果字符串相当大,不断重新调整容量的开销可能会变得明显.

那么,理智的std :: basic_string实现做了什么(或者甚至在标准中指定了什么)?

Dav*_*eas 6

常见的实现将遍历原始字符串以计算长度,然后分配那么多空间.它需要走两次字符串,但这是一个快速的操作,在某些情况下有硬件支持,即使没有硬件支持操作,它可能比单个内存分配便宜.

  • 此外,复制已知数量的字节也比复制未知大小更快. (3认同)