QSettings: overload value() instead of using a default argument

... of non-trivial type, which needs to be constructed every time the
function is called, no matter whether the user supplies one or not.

Effects on Linux AMD64 O2 C++20 tst_qsettings builds, as an example
heavy-duty QSettings::value() user:

GCC 11.2 libstdc++ (TEXT -= 4.6%):

     text    data     bss     dec     hex filename
   662317   10952    2824  676093   a50fd tst_qsettings-00-baseline
   631849   10960    2824  645633   9da01 tst_qsettings-01-qvariant

Clang 10.0.0 libc++ (TEXT -= 2.8%)

     text    data     bss     dec     hex filename
   808448   10616    2832  821896   c8a88 tst_qsettings-00-baseline
   785890   10624    2832  799346   c3272 tst_qsettings-01-qvariant

Pick-to: 6.3
Task-number: QTBUG-98117
Change-Id: I7366f063e3ec34c040fd35ffd274e8ed5a722132
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
bb10
Marc Mutz 2022-02-18 09:01:08 +01:00
parent d49f5752a5
commit 29b18a0179
3 changed files with 22 additions and 2 deletions

View File

@ -3254,6 +3254,9 @@ bool QSettings::event(QEvent *event)
#endif
/*!
\fn QSettings::value(const QString &key) const
\fn QSettings::value(const QString &key, const QVariant &defaultValue) const
Returns the value for setting \a key. If the setting doesn't
exist, returns \a defaultValue.
@ -3271,14 +3274,29 @@ bool QSettings::event(QEvent *event)
\sa setValue(), contains(), remove()
*/
QVariant QSettings::value(const QString &key) const
{
Q_D(const QSettings);
return d->value(key, nullptr);
}
QVariant QSettings::value(const QString &key, const QVariant &defaultValue) const
{
Q_D(const QSettings);
return d->value(key, &defaultValue);
}
QVariant QSettingsPrivate::value(const QString &key, const QVariant *defaultValue) const
{
if (key.isEmpty()) {
qWarning("QSettings::value: Empty key passed");
return QVariant();
}
return d->get(d->actualKey(key)).value_or(defaultValue);
if (std::optional r = get(actualKey(key)))
return std::move(*r);
if (defaultValue)
return *defaultValue;
return QVariant();
}
/*!

View File

@ -163,7 +163,8 @@ public:
bool isWritable() const;
void setValue(const QString &key, const QVariant &value);
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
QVariant value(const QString &key, const QVariant &defaultValue) const;
QVariant value(const QString &key) const;
void remove(const QString &key);
bool contains(const QString &key) const;

View File

@ -208,6 +208,7 @@ public:
virtual bool isWritable() const = 0;
virtual QString fileName() const = 0;
QVariant value(const QString &key, const QVariant *defaultValue) const;
QString actualKey(const QString &key) const;
void beginGroupOrArray(const QSettingsGroup &group);
void setStatus(QSettings::Status status) const;