Строка не копируется. Внутренние данные напрямую изменены.
Он в основном получает внутренний указатель данных фактической строки и изменяет его. Представьте себе следующее:
char *data = &str[0];
for(size_t i = 0; i < str.size(); ++i)
{
data[i] = '!';
}
Код устанавливает каждый символ строки восклицательным знаком. Но если строка была скопирована, то после первой записи указатель данных станет недействительным.
Или другой пример: СТД :: соиЬ < < ул [5] < < станд :: ENDL;
Это печатает 6-й символ строки. Почему бы это копия строка? C++ не может определить разницу между char c = str[5]
и str[5] = c
(за исключением того, что const и non-const вызовы функций идут).
Кроме того, str [n] гарантированно никогда не будет генерировать исключения, если n < str.size(). Он не может сделать эту гарантию, если ей придется выделять внутреннюю память для копии - потому что распределение может потерпеть неудачу и бросить.
(Как @juanchopanza упоминалось, старые стандарты C++ разрешены КОРОВА строк, но последний C стандарт ++ запрещает это)
Постоянно, вы изменяете буфер непосредственно. Фактически копирование цельной строки под cx11 должно быть O (n), поскольку оно использует семантику перемещения. – Samuel
в C++ 11 '' 'имеет свою копию строки с момента ее создания. C++ 03 позволяет * копировать при записи *, поэтому это зависит от реализации. – juanchopanza
Нет никакого копирования, связанного с этим кодом. У нас есть только инициализация и назначение. –