Является ли объект std :: string действительно подвижным? - PullRequest
0 голосов
/ 20 октября 2018

Как мы знаем, подвижный объект - это объект, который не будет копироваться глубоко, если его назначить другому объекту того же типа.Таким образом, мы можем сэкономить много времени.Но сегодня я обнаружил, что мне присуще явление.Пожалуйста, просмотрите код следующим образом.

#include <string>
#include <iostream>
int main() {
std::string s1 = "s1";
std::string s2 = "s2";

std::cout << "  s1[" << ( void* ) &s1[0] << "]:" + s1
    << ", s2[" << ( void* ) &s2[0] << "]:" + s2
    << std::endl;
s1.swap( s2 );
std::cout << "  s1[" << ( void* ) &s1[0] << "]:" + s1
    << ", s2[" << ( void* ) &s2[0] << "]:" + s2
    << std::endl;

s2 = std::move(s1);
std::cout << "  s1[" << ( void* ) &s1[0] << "]:" + s1
    << ", s2[" << ( void* ) &s2[0] << "]:" + s2
    << std::endl;

return EXIT_SUCCESS; }

После перемещения, хотя содержимое строк было изменено, но адрес, на котором действительно хранятся данные строки, не изменился.

Если адреса памяти не будут изменены, у нас может быть причина подтвердить, что на самом деле будет выполнено глубокое копирование, а не только присвоение указателя на член цели?

спасибо!Leon

1 Ответ

0 голосов
/ 20 октября 2018

Подвижный объект - это объект, который не будет скопирован глубоко, если он будет назначен другому объекту того же типа

Только если это имеет смысл.в следующем фрагменте

int i0 = 11;
int i1 = std::move(i0);

не будет «воровства» просто потому, что нечего воровать.поэтому предпосылка вопроса ошибочна - операция перемещения «украла бы» содержимое перемещения, если в этом есть смысл.

Также обратите внимание, что в мире C ++, в отличие от Java и C #, объектэто все, что занимает память - целые числа, указатели, символы - все они являются объектами.

std::string использует технику оптимизации, называемую «оптимизация короткой строки» или SSO .Если строка достаточно короткая (и «достаточно короткая» определяется реализацией), динамический буфер не выделяется и, следовательно, ничего не «крадет».когда такая короткая строка перемещается, содержимое строки настолько короткое, что просто копируется в строку, в которую перемещаются, без вмешательства в динамически размещенные буферы.

...