std :: String调整大小不会更改地址

时间:2019-01-27 16:31:47

标签: c++ string resize

我想检查一下是否调整了字符串的大小,字符串的地址是否会更改。因此,我编写了下面的程序,其中初始容量为1,然后将其更改为30,我假设在容量更改时字符串会移动地址,但是那没有发生。

有人可以解释为什么吗?

string s = "1";
string& s1 = s;
cout << &s  << " capacity is " << s.capacity() << endl;
cout << &s1 << endl;

s = "sdhflshdgfljasdjflkasdfhalsjdf";
cout << &s  << " capacity is " << s.capacity() << endl;
cout << &s1 << endl;

输出为

0x7ffc11fc08d0 capacity is 1                                                                                                           
0x7ffc11fc08d0                                                                                                                         
0x7ffc11fc08d0 capacity is 30                                                                                                          
0x7ffc11fc08d0                                                                                                                         

1 个答案:

答案 0 :(得分:6)

字符串变量将不会移动,但是当它分配更多内存时,它在内部保存指向内部指针的缓冲区可能会移动到新地址。但是,通过获取变量的地址是无法观察到的。如果您打印.data()成员返回的指针(通过将其强制转换为void指针),则可能会看到变化(假设新大小足以触发重新分配-许多字符串使用带有预分配的缓冲区,因此您需要扩大缓冲区。)