summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2022-04-04 08:40:43 -0700
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-04-14 06:16:28 +0000
commit47bf1a575651f98bc5860cf0feb79908c135354e (patch)
treefeff0837e80cd6326aa6d265a368dcedf89676e2
parenta37e9b44e7e758fef98377e1766e2fb042c4eea4 (diff)
QObjectPrivate: use ConnectionList's constructor instead of copy-assignment
For all new elements, this is the correct thing to do. This seems to work around an MSVC compiler bug on ARM64. It also seems to generate better code for x86-64 too, as a nice bonus. See: https://developercommunity.visualstudio.com/t/codegen-elides-initializers-when-copying/10004323 Before: https://msvc.godbolt.org/z/Wcd4haaPd After: https://msvc.godbolt.org/z/vWYjazWGr, https://gcc.godbolt.org/z/hdsvTq9nE Fixes: QTBUG-102246 Change-Id: I29f1c141c0f7436393d9fffd16e2bbbf4c0fe54d Reviewed-by: Marc Mutz <marc.mutz@qt.io> (cherry picked from commit bc6087fce259fe600c5d12785fa5f293f129965b) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/corelib/kernel/qobject_p.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
index 539818ac1d..996d8d1d19 100644
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -311,11 +311,14 @@ public:
SignalVector *newVector = reinterpret_cast<SignalVector *>(malloc(sizeof(SignalVector) + (size + 1) * sizeof(ConnectionList)));
int start = -1;
if (vector) {
+ // not (yet) existing trait:
+ //static_assert(std::is_relocatable_v<SignalVector>);
+ //static_assert(std::is_relocatable_v<ConnectionList>);
memcpy(newVector, vector, sizeof(SignalVector) + (vector->allocated + 1) * sizeof(ConnectionList));
start = vector->count();
}
for (int i = start; i < int(size); ++i)
- newVector->at(i) = ConnectionList();
+ new (&newVector->at(i)) ConnectionList();
newVector->next = nullptr;
newVector->allocated = size;