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. 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. Thank you, Berthold _______________________________________________ subsurface mailing list subsurface@subsurface-divelog.org http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface