#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
из функции, не используйте указатель — возврат по значению. В этом случае, скорее всего, будет применена оптимизация возвращаемого значения, и строковые данные не будут скопированы.