我想检查一下是否调整了字符串的大小,字符串的地址是否会更改。因此,我编写了下面的程序,其中初始容量为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
答案 0 :(得分:6)
字符串变量将不会移动,但是当它分配更多内存时,它在内部保存指向内部指针的缓冲区可能会移动到新地址。但是,通过获取变量的地址是无法观察到的。如果您打印.data()
成员返回的指针(通过将其强制转换为void指针),则可能会看到变化(假设新大小足以触发重新分配-许多字符串使用带有预分配的缓冲区,因此您需要扩大缓冲区。)