diff --git a/src/corelib/text/qbytearray.cpp b/src/corelib/text/qbytearray.cpp index 42921e99d76..4628c55ce50 100644 --- a/src/corelib/text/qbytearray.cpp +++ b/src/corelib/text/qbytearray.cpp @@ -1342,14 +1342,7 @@ QByteArray &QByteArray::operator=(const char *str) } else if (!*str) { d = DataPointer::fromRawData(&_empty, 0); } else { - const qsizetype len = qsizetype(strlen(str)); - const auto capacityAtEnd = d->allocatedCapacity() - d.freeSpaceAtBegin(); - if (d->needsDetach() || len > capacityAtEnd - || (len < size() && len < (capacityAtEnd >> 1))) - // ### inefficient! reallocData() does copy the old data and we then overwrite it in the next line - reallocData(len, QArrayData::KeepSize); - memcpy(d.data(), str, len + 1); // include null terminator - d.size = len; + assign(str); } return *this; } diff --git a/tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp b/tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp index 05e20645d70..5a8008a7eff 100644 --- a/tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp +++ b/tests/benchmarks/corelib/text/qbytearray/tst_bench_qbytearray.cpp @@ -31,6 +31,9 @@ private slots: void toPercentEncoding_data(); void toPercentEncoding(); + + void operator_assign_char(); + void operator_assign_char_data(); }; void tst_QByteArray::initTestCase() @@ -353,6 +356,38 @@ void tst_QByteArray::toPercentEncoding() QTEST(encoded, "expected"); } +void tst_QByteArray::operator_assign_char() +{ + QFETCH(QByteArray, data); + QString str(data.size(), Qt::Uninitialized); + + const char *tdata = data.constData(); + QBENCHMARK { + str.operator=(tdata); + } +} + +void tst_QByteArray::operator_assign_char_data() +{ + QTest::addColumn("data"); + + QByteArray data; + data.fill('a', 5); + QTest::newRow("length: 5") << data; + data.fill('b', 10); + QTest::newRow("length: 10") << data; + data.fill('c', 20); + QTest::newRow("length: 20") << data; + data.fill('d', 50); + QTest::newRow("length: 50") << data; + data.fill('e', 100); + QTest::newRow("length: 100") << data; + data.fill('f', 500); + QTest::newRow("length: 500") << data; + data.fill('g', 1'000); + QTest::newRow("length: 1'000") << data; +} + QTEST_MAIN(tst_QByteArray) #include "tst_bench_qbytearray.moc"