std :: Изменение размера строки не меняет адрес - PullRequest
0 голосов
/ 27 января 2019

Я хотел проверить, если размер моей строки изменится, адрес строки изменится или нет.Поэтому я написал следующую программу, в которой начальная емкость равнялась 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 голосов
/ 27 января 2019

Строковая переменная не будет перемещаться, но буфер, внутри которого она содержит указатель, может перемещаться на новый адрес, поскольку он выделяет больше памяти.Это не наблюдается, если взять адрес переменной .Если вы напечатаете указатель, возвращенный элементом .data() (путем приведения его к пустому указателю), вы можете увидеть изменение (при условии, что нового размера достаточно, чтобы вызвать перераспределение - многие строки используют небольшую оптимизацию строки с заранее выделенным буферомтак что вам нужно выйти за рамки этого).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...