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

std::String resizing doesnt change address

我想检查如果我的字符串调整大小,字符串的地址是否会改变。所以我写了下面的程序,其中初始容量为 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                                                                                                                         

字符串变量不会移动,但它在内部保存指针的缓冲区可能会随着分配更多内存而移动到新地址。但是,通过获取 变量 的地址无法观察到这一点。如果打印 .data() 成员返回的指针(通过将其转换为空指针),您可能会看到变化(假设新大小足以触发重新分配 - 许多字符串使用带有预定义的小字符串优化分配的缓冲区,因此您需要超出该范围)。