Конструктор копирования строк в C ++ STL - всегда глубокая копия? - PullRequest
11 голосов
/ 12 декабря 2011

Я видел различные противоречивые ссылки на поведение конструктора копирования строк STL в C ++, и я надеялся, что кто-нибудь сможет прояснить это для меня, учитывая следующий сегмент кода:

string str() { return string("this is a string"); }
//meanwhile, in some other function...
string s = str();

Имеет ли объект 's 'представляет собой глубокую копию строкового объекта, определенного в функции' str () '?или объект 's' просто указывает на тот же кусок памяти, выделенный во время вызова строкового конструктора в функции 'str ()'?

Ответы [ 2 ]

5 голосов
/ 12 декабря 2011

Строка будет глубокое копирование, они не используют один и тот же буфер.

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

Если вы используете c ++ 11, то семантика перемещения определяется стандартом, так что для такой вещи, как возвращаемая строка, будьте уверены, что худший случай (даже без оптимизаций) будет довольно дешевым.

РЕДАКТИРОВАТЬ: резюмируя, вы гарантируете, что строка, которой вы «владеете», будет иметь уникальный кусок памяти, который будет сохраняться как минимум в течение времени жизни локальной строки. Однако более чем вероятно, что компилятор не скопирует его из строки в функции, а просто поменяет местами его указатели или даже полностью исключит копию (то есть строка в функции будет фактически строкой, которую вы также назначите).

1 голос
/ 12 декабря 2011

Да, он выполняет логическое глубокое копирование.

С N3126 , 21.4.2, Таблица 61:

data() - указывает напервый элемент выделенной копии массива, на первый элемент которого указан str.data()

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