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/qarraydata.cpp | |
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/qarraydata.cpp')
-rw-r--r-- | src/corelib/tools/qarraydata.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/corelib/tools/qarraydata.cpp b/src/corelib/tools/qarraydata.cpp index 3217e87cc8..2bf3e9bacc 100644 --- a/src/corelib/tools/qarraydata.cpp +++ b/src/corelib/tools/qarraydata.cpp @@ -236,6 +236,7 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer, qsizetype headerSize = sizeof(QArrayData); qsizetype allocSize = calculateBlockSize(capacity, objectSize, headerSize, option); qptrdiff offset = dataPointer ? reinterpret_cast<char *>(dataPointer) - reinterpret_cast<char *>(data) : headerSize; + Q_ASSERT(offset > 0); allocSize = reserveExtraBytes(allocSize); if (Q_UNLIKELY(allocSize < 0)) // handle overflow. cannot reallocate reliably @@ -245,6 +246,8 @@ QArrayData::reallocateUnaligned(QArrayData *data, void *dataPointer, if (header) { header->alloc = uint(capacity); dataPointer = reinterpret_cast<char *>(header) + offset; + } else { + dataPointer = nullptr; } return qMakePair(static_cast<QArrayData *>(header), dataPointer); } |