[Development] HEADS-UP: QStringLiteral
Mutz, Marc
marc at kdab.com
Wed Aug 21 15:34:53 CEST 2019
On 2019-08-21 14:13, Sérgio Martins via Development wrote:
> On 2019-08-20 16:56, Bogdan Vatra via Development wrote:
>> Hi,
>>
>> Isn't silly to have so many wrappers around a such a simple thing as
>> strings? All the major frameworks out there (i.e. Java, C#) they have
>> a single
>> String which does all the magic.
>
> We do have a single one that does all the magic: QString. A Qt user
> can ignore all others.
Ack.
> The difference between Qt and Java or C# is that we also offer
> non-allocating alternatives for users who care. And if they care, they
> need to learn them.
Another difference is that, in Java at least (or was it JavaScript?),
"foo" _is_ a String (as in "foo".length()). This is decidedly not the
case in C++/Qt. In Java, the compiler can place "foo" into read-only
memory, and it will be an (immutable, as I learned) String instance.
It's probably also the case that all "foo" in the same program are the
same string. All this is, or at least may be, also the case for "foo" in
C++, except that "foo" is not a std::string or QString instance. C++ has
no concept of strings. Only of string literals. "foo" is a const
char[4]. To manipulate it, you need to use malloc/strdup/strcpy, or you
must copy the data into a user-defined class such as std::string or
QString. We can lament this over and over again, but it will not change
the facts. QStringLiteral is an attempt at fixing this: a fully-fledged
QString, but placed in read-only memory, no runtime allocations. The
problem is that the way it's implemented, QStringLiteral("foo") +
QStringLiteral("foo") stores the string u"foo" and its QStringData
header, _twice_ in the executable. And since we globally enabled
QStringBuilder, there's no runtime efficiency difference to
QLatin1String("foo") + QLatin1String("foo") which _will_ store "foo"
just once.
> For the case that triggered this discussion, the androiddeployqt
> executable, I wouldn't bother with optimizations and just use what's
> more readable, even raw strings.
I agree in principle. The problem in Qt code is that it's mostly
library, and making checkers (and reviewers) aware of the type of source
code will be extra work compared to just applying the same rules
everywhere. After all, this is decidedly not optimisation, it's avoiding
pessimisation, and as such, the non-pessimised version of the code
should naturally flow from your fingers. It should take extra mental
work to unlearn the library rules when coding on a tool for once.
And:
Code gets copied: this is from a tool:
https://codereview.qt-project.org/c/qt/qt3d/+/263442/2/tools/qgltf/qgltf.cpp
this was later found in a plugin:
https://codereview.qt-project.org/c/qt/qt3d/+/268271/2/src/plugins/sceneparsers/assimp/assimphelpers.cpp
So while I totally agree that in application code, do as you want, the
advice is not quite so clear-cut for Qt tools, or, in fact, any project
where the same developers are working on a library as well as tools.
Thanks,
Marc
More information about the Development
mailing list