[Development] How qAsConst and qExchange lead to qNN
Ulf Hermann
ulf.hermann at qt.io
Wed Nov 16 09:05:20 CET 2022
>> That's a deep copy. A deep copy of a string is obviously more expensive
>> than the overhead of calling the QString ctor and dtor.
>
> That remains to be proven. A rule of thumb for atomics is that they're
> two orders of magnitude slower than a normal int. They also still act as
> optimizer firewalls. With that rule of thumb, copying 50 char16_t's is
> faster than one ref-count update. What really is the deciding point is
> whether or not there's a memory allocation involved. I mentioned that
> for many use-cases, therefore, a non-CoW SBO container is preferable over a CoW
> non-SBO one.
As stated elsewhere, the real problem about the deep copy is the
allocation involved in it, not necessarily the copying of the elements.
>> I can't say what case is more common. What I can say is that the risk of
>> creating deep copies sounds worse to me than the risk of calling the
>> QString ctor and dtor too often.
>>
>> This is what I mean with "fuzzy". We don't really have the data to
>> support a move to QAnyStringView for all of our API.
>
> I can say with firm belief that, _atm_, passing QString is more common.
> But this is a self-fulfilling fact. The tst_qsettings experiment shows
> what can happen if you port an API that doesn't naturally receive
> pre-made QStrings.
Are we in a position to change how people use our APIs? I can say with
firm belief that most existing applications using Qt will not be
rewritten from the ground up to avoid passing QString and QList to Qt
APIs. So they will pay the cost of deep copies if we force
QAnyStringView and QSpan on them by changing our API. There are lots of
existing Qt applications. Your CO2 calculation doesn't look that great then.
New APIs that are not used in the "wrong" way all over the world, yet,
are a different story. If we can provide a clean QAnyStringView or QSpan
override without ambiguities, it's also a different story. (But adding
complexity to the API is still a thing).
Maybe we can approach this in a module-by-module way. QtWidgets is
probably pretty "bad" regarding QList and QString arguments, and no one
will change their old widgets applications to suit our newfangled
containers.
QtQml and QtQuick, on the other hand, hardly have any C++ API, and most
QML and QtQuick applications are not that old. We might get away with
changing API there.
QtCore and QtGui is where the most difficult decisions are to be taken,
I guess.
best regards,
Ulf
More information about the Development
mailing list