[Development] RFC: Deprecating setSharable / isSharable in our containers and QString

Knoll Lars Lars.Knoll at digia.com
Thu Feb 20 09:16:26 CET 2014


On 20/02/14 08:32, "Thiago Macieira" <thiago.macieira at intel.com> wrote:

>... and removing them in Qt 6
>
>Please raise your hand if you knew we had that feature.
>
>Please raise your hand if you've ever used them in your own code.
>
>I doubt anyone has raised their hands to the second question and there
>mustn't 
>be more than 2 people who did for the first question. This is a very
>obscure 
>feature in our containers, which are normally implicitly shared: they can
>be 
>made unsharable.
>
>However, this is not a performance optimisation. All non-const calls will
>still check the reference count to see if they need to detach or not.
>Though 
>you may be sure that the calls will not throw exceptions, those functions
>are 
>still noexcept(false). So code generation is still bad.
>
>And most importantly, we're paying the price for this obscure feature in
>EVERY 
>SINGLE ref or deref of any container using QArrayData or QRefCounter.
>That's 
>one extra comparison in each of those, plus the generation of the copy
>code 
>for the ref-up.
>
>I'd like to remove the feature in Qt 6. Opinions?
>
>
>
>Where it's used in Qt 5 (aside from tests):
>
>src/corelib/tools/qiterator.h:    { c->setSharable(false); i =
>c->begin(); n = 
>c->end(); } \
>src/corelib/tools/qiterator.h:    { c->setSharable(true); } \
>src/corelib/tools/qiterator.h:    { c->setSharable(true); c = &container;
>c-
>>setSharable(false); \
>src/corelib/tools/qiterator.h:    { c->setSharable(false); i =
>c->begin(); n = 
>c->end(); } \
>src/corelib/tools/qiterator.h:    { c->setSharable(true); } \
>src/corelib/tools/qiterator.h:    { c->setSharable(true); c = &container;
>c-
>>setSharable(false); i = c->begin(); n = c->end(); return *this; } \
>src/corelib/tools/qset.h:    { c->setSharable(false); i = c->begin(); n =
>c-
>>end(); }
>src/corelib/tools/qset.h:    { c->setSharable(true); }
>src/corelib/tools/qset.h:    { c->setSharable(true); c = &container; c-
>>setSharable(false);
>
>Read: Java-style mutable iterators. And the above is slightly broken,
>because 
>you can always just create a second mutable iterator on the same
>container, 
>which would set it back to sharable when the iterator got destroyed. It
>also 
>doesn't stop the iterator from getting invalidated if you modify the
>container 
>outside the iterator.
>
>STL-style iterators currently have the requirement that you should not
>create 
>a copy of the container while iterating for mutation. And even then, I
>can't 
>see right now an operation in the Java-style mutable iterators that would
>break by removing those setSharable() calls, not after the fixes to
>insert() 
>we've done.


+1 for deprecation/removing from my side.

Cheers,
Lars



More information about the Development mailing list