[Interest] Building strings with .arg() (arrrgh)
Max Paperno
max-l at wdg.us
Mon Feb 17 05:33:15 CET 2020
HI folks,
I'm confused about a "best" way to use .arg() with fixed/static strings
(not tr()). Or if it should be used at all, for that matter, in terms of
efficiency.
QStringLiteral seemed pretty good to me after reading several blog posts
(from Marc Mutz, Kai Koehne, Olivier Goffart, among others), all of
which are mentioned on Qtforum post [Create QString with QStringLiteral
and arg][1] along with some opinions.
Then found the [HEADS-UP: QStringLiteral][2] post by Marc on the
development list and didn't feel so good about it anymore. Specifically
where he says that using it with .arg() is an "anti-pattern" but not in
any way that I can understand (vs. just using QString). I went through
that whole meandering thread but didn't see string builder stuff brought
up again.
It also mentions (and I found other references) that QStringView and
QLatin1String have .arg() methods, albeit w/out number formatting.
Which I can see in the code, but aren't documented anywhere AFAICT. Nor
can I find when these methods became available. I'm hesitant to use
undocumented methods (though it wouldn't be the first time) and would
prefer to maintain as much compatibility with older Qt versions as
possible/reasonable. More importantly, I have no idea what doing
something like QLatin1String("foo %1").arg(myQstring) would even mean.
OTOH I found a number of code examples here and there (including KDE
code, like Konsole) where people specifically changed
QString("%1").arg() calls to use QStringLiteral instead.
Also I'm not clear if using QStringLiteral with + (or %) operators is
also an "anti-pattern"... I understand the methods like append() can
make more efficient use of QLatin1String, but does a plain quote-wrapped
char literal get implicitly converted to QString when used e.g. like:
"Value of " + myQstring + " is: " + QString::number(x);
Would it be more efficient to wrap those literals in a QStringLiteral,
QLatin1String, QStringView (or u""), or just leave them bare?
Realizing that "best" is subjective, and thinking of a specific project
I'm working on, my goals, in order of importance, are, roughly:
1) Stability; 2) Minimal CPU time (fast, some of this could be used
within animations and such); 3) Runtime memory use; 4) Clean code; 5)
Size of produced binary.
In many cases I'm just building strings for error/warning/status
messages (but not QDebug streams, although they may end up as debug
output eventually, or never be seen at all). And these don't, or
shouldn't, happen very often at runtime. But in some cases the stings
will be used internally by other code. In most (if not all) cases I
don't care about UTF encoding, plain ASCII/L1 is fine. But there are
often numerical types involved which need to be converted to strings
somehow. And other strings to be inserted (with .arg()) are often
QStrings (from Qt lib code or whatever). The built strings are typically
passed on to other functions (as const QString &) for further processing
or possible display to the user/downstream developer.
What's a programmer to do? Does it even matter? Is there a faster way
to build strings (within reason... yes I could just use C-level code but
let's not get carried away).
Thanks!
-Max
[1]:
https://forum.qt.io/topic/86964/create-qstring-with-qstringliteral-and-arg/8
[2]:
https://lists.qt-project.org/pipermail/development/2019-August/037145.html
More information about the Interest
mailing list