新的内存分配

来源:互联网 发布:手机淘宝购物车 编辑:程序博客网 时间:2024/05/29 14:36

注意能力高于字符串的长度!虽然我们的字符串长度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;

0 0