From 657e8ffb9ecdf451b9db85dd5dfbc820d2ac3ca5 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 20 May 2015 19:03:42 +0200 Subject: [PATCH] QSettings: replace a QMap with a QList The QMap was only used to create a sorted, unique list of keys. The associativeness was never used (the value was always the null QString). Better to use a QStringList instead and sort-unique the whole thing at the end. Saves ~1.6K in text size on Linux AMD64 GCC 4.9 release C++11 builds, and a tremendous amount of heap allocations. Change-Id: Idf749dd8924b3894e436aa1cee0304002b898975 Reviewed-by: Olivier Goffart (Woboq GmbH) --- src/corelib/io/qsettings.cpp | 11 +++++++---- src/corelib/io/qsettings_mac.cpp | 7 +++++-- src/corelib/io/qsettings_p.h | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp index 2ae89af3565..b61cba7f7de 100644 --- a/src/corelib/io/qsettings.cpp +++ b/src/corelib/io/qsettings.cpp @@ -299,7 +299,7 @@ QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::F } #endif -void QSettingsPrivate::processChild(QStringRef key, ChildSpec spec, QMap &result) +void QSettingsPrivate::processChild(QStringRef key, ChildSpec spec, QStringList &result) { if (spec != AllKeys) { int slashPos = key.indexOf(QLatin1Char('/')); @@ -312,7 +312,7 @@ void QSettingsPrivate::processChild(QStringRef key, ChildSpec spec, QMap result; + QStringList result; ParsedSettingsMap::const_iterator j; QSettingsKey thePrefix(prefix, caseSensitivity); @@ -1307,7 +1307,10 @@ QStringList QConfFileSettingsPrivate::children(const QString &prefix, ChildSpec break; } } - return result.keys(); + std::sort(result.begin(), result.end()); + result.erase(std::unique(result.begin(), result.end()), + result.end()); + return result; } void QConfFileSettingsPrivate::clear() diff --git a/src/corelib/io/qsettings_mac.cpp b/src/corelib/io/qsettings_mac.cpp index 083722869ff..1ad198b9908 100644 --- a/src/corelib/io/qsettings_mac.cpp +++ b/src/corelib/io/qsettings_mac.cpp @@ -491,7 +491,7 @@ bool QMacSettingsPrivate::get(const QString &key, QVariant *value) const QStringList QMacSettingsPrivate::children(const QString &prefix, ChildSpec spec) const { - QMap result; + QStringList result; int startPos = prefix.size(); for (int i = 0; i < numDomains; ++i) { @@ -513,7 +513,10 @@ QStringList QMacSettingsPrivate::children(const QString &prefix, ChildSpec spec) if (!fallbacks) break; } - return result.keys(); + std::sort(result.begin(), result.end()); + result.erase(std::unique(result.begin(), result.end()), + result.end()); + return result; } void QMacSettingsPrivate::clear() diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h index 004751182c2..534527ed5a9 100644 --- a/src/corelib/io/qsettings_p.h +++ b/src/corelib/io/qsettings_p.h @@ -211,7 +211,7 @@ public: const QString &organization, const QString &application); static QSettingsPrivate *create(const QString &fileName, QSettings::Format format); - static void processChild(QStringRef key, ChildSpec spec, QMap &result); + static void processChild(QStringRef key, ChildSpec spec, QStringList &result); // Variant streaming functions static QStringList variantListToStringList(const QVariantList &l);