新的内存分配

理解字符串容量与重新分配的重要性

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值