summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2020-07-10 13:39:20 +0200
committerLars Knoll <lars.knoll@qt.io>2020-08-24 00:17:04 +0200
commit76e8e8e9c8093f093cb9f37d61d273f43398fefb (patch)
tree9fc52a731ac9bae072ee2bf61feb728c7c517917
parentcb17157b2762ca5deebe16d4867346437acf3fe0 (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.cpp3
-rw-r--r--src/corelib/kernel/qvariant_p.h3
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp4
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;