注意能力高于字符串的长度!虽然我们的字符串长度8、15个字符的字符串实际上分配足够的内存!为什么这是做了什么?
最重要的认识是,如果用户希望把更多的角色比字符串有能力成一个字符串,该字符串必须重新分配一个更大的容量。例如,如果一个字符串长度和容量8,然后添加任何字符字符串将迫使重新分配。通过能力大于实际的字符串,这给用户一些缓冲的空间扩大字符串之前需要进行重新分配。
事实证明,重新分配是不好的几个原因:
首先,重新分配一个字符串是相对昂贵的。首先,必须新的内存分配。然后字符串中的每个字符必须复制到新的内存。这可能需要很长时间如果字符串是大的。最后,旧的记忆已经被收回。如果你正在做许多reallocations,这个过程可以显著延缓你的程序。
第二,无论何时重新分配一个字符串,字符串的内容改变到一个新的内存地址。这意味着所有引用、指针和迭代器的字符串变成无效!
注意,并非总是如此,字符串将被分配能力大于长度。考虑下面的程序:
1
2
3
|
string sString(
"0123456789abcde"
);
cout <<
"Length: "
<< sString.length() << endl;
cout <<
"Capacity: "
<< sString.capacity() << endl;
|
这个程序输出:
长度:15
能力:15
(结果可能取决于编译器)。
让我们添加一个字符字符串和观察的能力改变:
1
2
3
4
5
6
7
8
|
string sString(
"0123456789abcde"
);
cout <<
"Length: "
<< sString.length() << endl;
cout <<
"Capacity: "
<< sString.capacity() << endl;
// Now add a new character
sString +=
"f"
;
cout <<
"Length: "
<< sString.length() << endl;
cout <<
"Capacity: "
<< sString.capacity() << endl;
|
由此产生的结果是:
长度:15
能力:15
长度:16
容量:31
空字符串:储备()
空字符串::储备(size_type unSize)
第二味这个函数集的容量字符串至少unSize(它可以更大)。请注意,这可能需要重新分配。
如果第一个味道的函数被调用时,或者第二个味道叫做unSize不到目前的能力,该函数将试图收缩能力匹配长度。这是一个不具约束力的请求。
示例代码:
1
2
3
4
5
6
7
8
9
10
11
|
string sString(
"01234567"
);
cout <<
"Length: "
<< sString.length() << endl;
cout <<
"Capacity: "
<< sString.capacity() << endl;
sString.reserve(200);
cout <<
"Length: "
<< sString.length() << endl;
cout <<
"Capacity: "
<< sString.capacity() << endl;
sString.reserve();
cout <<
"Length: "
<< sString.length() << endl;
cout <<
"Capacity: "
<< sString.capacity() << endl;
|