diff options
author | Lars Knoll <lars.knoll@qt.io> | 2020-07-10 13:39:20 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2020-08-24 00:17:04 +0200 |
commit | 76e8e8e9c8093f093cb9f37d61d273f43398fefb (patch) | |
tree | 9fc52a731ac9bae072ee2bf61feb728c7c517917 | |
parent | cb17157b2762ca5deebe16d4867346437acf3fe0 (diff) |
Always use the variants internal space if possible
There's no point in storing small types with an external
refcount, even if they aren't movable. Simply copying
the type should be faster in pretty much all cases, while
this uses less memory.
Change-Id: I127474f8e3c5fa042f530684f9d5bfccbba134ca
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 3 | ||||
-rw-r--r-- | src/corelib/kernel/qvariant_p.h | 3 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 4 |
3 files changed, 5 insertions, 5 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 104a7263b4..a6b383d359 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -1398,8 +1398,7 @@ static void customConstruct(QVariant::Private *d, const void *copy) } // this logic should match with QVariantIntegrator::CanUseInternalSpace - if (size <= sizeof(QVariant::Private::Data) - && (type.flags() & (QMetaType::MovableType | QMetaType::IsEnumeration))) { + if (size <= sizeof(QVariant::Private::Data)) { type.construct(&d->data, copy); d->is_shared = false; } else { diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index 0682d1d6b3..f92f97d836 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -63,8 +63,7 @@ QT_BEGIN_NAMESPACE template<typename T> struct QVariantIntegrator { - static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data) - && ((QTypeInfoQuery<T>::isRelocatable) || std::is_enum<T>::value); + static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data); typedef std::integral_constant<bool, CanUseInternalSpace> CanUseInternalSpace_t; }; static_assert(QVariantIntegrator<double>::CanUseInternalSpace); diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index e18b6e024a..4e67f42dce 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -1909,7 +1909,7 @@ void tst_QVariant::userType() QCOMPARE(instanceCount, 3); { QVariant second = myCarrier; - QCOMPARE(instanceCount, 3); + QCOMPARE(instanceCount, 4); second.detach(); QCOMPARE(instanceCount, 4); } @@ -3315,6 +3315,8 @@ struct MyNotMovable if (!ok) qFatal("MyNotMovable has been moved"); return ok; } + // Make it too big to store it in the variant itself + void *dummy[4]; }; int MyNotMovable::count = 0; |