Относно QStringLiteral

QStringLiteral Е нов макрос, въведен в Qt 5, за създаване на QString обекти от низ литерали. (String литералите са низове в кавички в изходния код). В тази статия ще обясня какво има вътре и как се изпълняват.

Позволете ми да започна, като ви кажа кога да използвате макрос. Ако има нужда да инициализирате QString обект от низ литерал в Qt5, тогава трябва да направите това:

  • В повечето случаи QStringLiteral ("foo") ако всъщност се преобразува в QString.
  • QLatin1String ("foo"), ако ще се използва при претоварване QLatin1String методи. (напр оператор ==, оператор+, Започни с, замени, . )

Дадох заключенията в самото начало на статията за тези, които не се интересуват от технически подробности.

Нека да обобщим как работи QString

QString, както повечето класове в Qt, използва неявно споделяне. Показалецът към "частни" данни е единственият член на класа. Памет за QStringData се разпределя с malloc и след това се разпределя и паметта за самия низ.

qstringliteral

offset - указател към данни, свързани с QStringData. В Qt4 това беше действителен указател.

Данните от низовете се съхраняват във формат UTF-16, който използва 2 байта на символ.

Литерали и трансформации

String литералите са низове, които се появяват в кавички в кода. Нека дадем пример. (действие, низ и име на файл - това QString)

В първия ред извикваме функцията QObject: setObjectName (const QString &). Неявното кастинг се получава от const char * в QString, чрез неговия конструктор. Нов обект QStringData създаден с достатъчно място за съхранение "MyObject", и след това низът се копира и преобразува от UTF-8 в UTF-16.

Същото се случва и на последния ред, където се извиква функцията QString: замени (const QString &, const QString &). За "% Име на файл%" се създава нов обект QStringData.

Има ли решение да се избегне създаването на QStringData и копирането на низа?

Да, едно решение за избягване на скъпото създаване на временен QString обект е да има претоварени методи, които вземат параметри const char *.
Претоварени сме оператор ==