From 76e8e8e9c8093f093cb9f37d61d273f43398fefb Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 10 Jul 2020 13:39:20 +0200 Subject: [PATCH] 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 --- src/corelib/kernel/qvariant.cpp | 3 +-- src/corelib/kernel/qvariant_p.h | 3 +-- 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 struct QVariantIntegrator { - static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data) - && ((QTypeInfoQuery::isRelocatable) || std::is_enum::value); + static const bool CanUseInternalSpace = sizeof(T) <= sizeof(QVariant::Private::Data); typedef std::integral_constant CanUseInternalSpace_t; }; static_assert(QVariantIntegrator::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;