Должен ли я использовать указатель на std::string

#c #qt #pointers #std

#c #qt #указатели #std

Вопрос:

При изучении c я сначала использую библиотеку Qt вместо стандартного C , STL и всего такого (хорошо, я новичок в c и избалован Qt). В Qt QString использовал неявное совместное использование, что позволило мне просто скопировать присвоить его другой переменной, например:

 QString var1=QString("Hi there!");
QString var2=var1
 

И это было бы неплохо без особых накладных расходов. Но теперь я пытаюсь std::string итак, я должен сделать

 std::string var1=std::string()
 

или

 std::string* var1=new std::string()
 

А также, как насчет QVector и std::vector. И если мне нужно использовать указатель… какие-нибудь советы?

Ответ №1:

std::string Использует ли копирование при записи, зависит от реализации (т. Е. Это Решает поставщик вашей стандартной библиотеки). Однако большинство std::string реализаций не будут использовать COW, в основном из-за того, что большинство, если не все операции чтения принудительно копируют — operator[] возвращает ссылку c_str() и data() возвращает указатель. Сравните это с QString::operator[] , который возвращает прокси-объект.

Несмотря на вышесказанное, не используйте указатели на std::string , если только вы не определите (путем измерения), что копии строк являются узким местом в вашем приложении.

Кроме того, имейте в виду, что QString хранит строки UTF-16, тогда std::string как хранит последовательность char s — QByteArray будет эквивалентом Qt.

Комментарии:

1. std::string больше не разрешено выполнять COW (C 11), поскольку это приведет к аннулированию итераторов.

Ответ №2:

 std::string var1("Hi there!");
std::string var2=var1; 
 

класс std::string имеет = оператор, определенный как:

 stringamp; operator= ( const stringamp; str );
 

Комментарии:

1. В этом случае должен вызываться конструктор копирования, а не присваивание копирования?

Ответ №3:

 std::string* var1=new std::string()
 

Не делайте этого. Просто передайте его по ссылке везде, где это возможно:

 void f(const std::stringamp; s); // no copying
 

Если вам действительно нужно поделиться строкой, используйте:

 std::shared_ptr<std::string> var1 = std::make_shared<std::string>();
 

Ответ №4:

Если вы собираетесь возвращаться std::string из функции, не используйте указатель — возврат по значению. В этом случае, скорее всего, будет применена оптимизация возвращаемого значения, и строковые данные не будут скопированы.