From a7bb69fb87219673a530af0143660267a3ffd2d8 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 30 Apr 2024 14:58:20 +0200 Subject: [PATCH] QVLA::erase: use trivial relocation Apply the same algorithm that QVector uses for erasing elements: destroy the erased range, then memmove the tail over. Change-Id: I6f2edde5b208910b665f85167cf9359379137a85 Reviewed-by: Thiago Macieira --- src/corelib/tools/qvarlengtharray.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index 6489c66ea3d..0a579bf4873 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -968,10 +968,11 @@ Q_OUTOFLINE_TEMPLATE auto QVLABase::erase(const_iterator abegin, const_iterat Q_ASSERT(n > 0); // aend must be reachable from abegin - if constexpr (QTypeInfo::isComplex) { + if constexpr (!QTypeInfo::isRelocatable) { std::move(begin() + l, end(), QT_MAKE_CHECKED_ARRAY_ITERATOR(begin() + f, size() - f)); std::destroy(end() - n, end()); } else { + std::destroy(abegin, aend); memmove(static_cast(data() + f), static_cast(data() + l), (size() - l) * sizeof(T)); } this->s -= n;