diff options
| author | Andrei Golubev <andrei.golubev@qt.io> | 2020-10-28 18:14:21 +0100 |
|---|---|---|
| committer | Lars Knoll <lars.knoll@qt.io> | 2020-11-04 11:22:03 +0100 |
| commit | 2e8656779ac3eee8567ce2bf8eda233f4c5e3620 (patch) | |
| tree | e31419d216afba652b7f6b6df11a1519c2690db4 /src/corelib/tools/qarraydatapointer.h | |
| parent | 8f7016252a846e30efb617d2e20e929579772456 (diff) | |
Introduce QADP::reallocateGrow()
Added realloc() code path to QMovableArrayOps
Implemented fast realloc() based growing for QADP and used it in
QList::emplaceBack. This gives quite a bit of speedup and shows better
results than 5.15 at 100k+ iterations of "list.append(elem)", meanwhile
also closing a gap between movable types
Task-number: QTBUG-87330
Change-Id: I42fc182ecd93c85600dac622385152fc57735da8
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qarraydatapointer.h')
| -rw-r--r-- | src/corelib/tools/qarraydatapointer.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/corelib/tools/qarraydatapointer.h b/src/corelib/tools/qarraydatapointer.h index d483a5a5e5b..20015cbaddc 100644 --- a/src/corelib/tools/qarraydatapointer.h +++ b/src/corelib/tools/qarraydatapointer.h @@ -244,6 +244,25 @@ public: return lhs.data() != rhs.data() || lhs.size != rhs.size; } + static void reallocateGrow(QArrayDataPointer &from, qsizetype n) + { + Q_ASSERT(n > 0); + + if constexpr (!QTypeInfo<T>::isRelocatable || alignof(T) > alignof(std::max_align_t)) { + QArrayDataPointer dd(allocateGrow(from, n, QArrayData::AllocateAtEnd)); + dd->copyAppend(from.data(), from.data() + from.size); + from.swap(dd); + } else { + if (from.needsDetach()) { + QArrayDataPointer dd(allocateGrow(from, n, QArrayData::AllocateAtEnd)); + dd->copyAppend(from.data(), from.data() + from.size); + from.swap(dd); + } else { + from->reallocate(from.constAllocatedCapacity() - from.freeSpaceAtEnd() + n, QArrayData::Grow); // fast path + } + } + } + private: [[nodiscard]] QPair<Data *, T *> clone() const { |
