Roll our own qUtf8Printable()?

Lubomir I. Ivanov neolit123 at gmail.com
Sun Feb 25 13:40:00 PST 2018


On 25 February 2018 at 21:39, Berthold Stoeger
<bstoeger at mail.tuwien.ac.at> wrote:
> Dear all,
>
> In many places, QStrings are converted to C-style strings with an expression
> of the kind
>  s.toUf8().data()
>
> I have a patch replacing all of them with
>  qUtf8Printable(s)
>
> The idea is that - according to the documentation - this is equivalent to
>  s.toUtf8().constData()
>
> The latter should produce less machine code, because it doesn't have to check
> whether the data of the temporary QByteArray is shared. Owing to the many
> indirections in Qt's code, the compiler is not smart enough to understand that
> in this case data() = constData().
>
> Much to my surprise, qUtf8Printable() produced larger code. The reason is that
> it is defined as a macro in <qglobal.h>:
>
> #ifndef qUtf8Printable
> #  define qUtf8Printable(string) QString(string).toUtf8().constData()
> #endif
>
> It generates a temporary copy of the string! This looks like a defect to me.
>

the compiler could be missing an optimization opportunity for the copy?
maybe the inline version (118 bytes) produces simply better optimized code.
have your tried with a different compiler and playing with -Oxx?

> So what do you think about rolling our own helper function:
>
> inline const char *qstring2c(const QString &s)
> {
>         return s.toUtf8().constData();
> }
>
> Some numbers (size of the .text segment):
> const char *test(const QString &s) { return qUtf8Printable(s); } -> 267 bytes
> const char *test(const QString &s) { return s.toUtf8().data(); } -> 236 bytes
> const char *test(const QString &s) { return qstring2c(s); }      -> 118 bytes
>
> That's a 50% size reduction per invocation.
>

my rule of thumb would be that we should reinvent the wheel for the
sake of size or speed even.
1000 instances of the qUtf8Printable() macro would be 267 * 1000 and
that's 267kb which isn't that much.

at the same time nothing prevent's us from having this helper if we
prefer it over the recommended method.

lubomir
--


More information about the subsurface mailing list