[Development] HEADS UP: Don't use QList, use Q_DECLARE_TYPEINFO

Giuseppe D'Angelo dangelog at gmail.com
Mon Jul 27 06:15:08 CEST 2015


On Mon, Jul 27, 2015 at 12:27 AM, Kevin Kofler <kevin.kofler at chello.at> wrote:
>
> It doesn't switch the stuff it actually guarantees:
> * Moving n elements in the list (for whatever reason) will only move
>   n*sizeof(void*) bytes (not n*sizeof(T), nor will it call any copy
>   constructors or destructors).

True, although the not calling constructors/destructors is (should?)
also be true for QVector when using Q_MOVABLE_TYPE. (Also nobody says
that middle insertions of removals should be "extra cheap").

> * Both prepending and appending is done in amortized O(1) time.

Prepending could be achieved for QVector too. But how common is it?

> * Accessing the i-th element is performed in guaranteed O(1) time.

For "bad" types for QList, that O(1) is hiding two indirections. Only
one with QVector. That's a huge cost you're not talking about.

> * Inserting an element performs at most 1 heap allocation. (This is the only
>   performance metric that can change, but the changing from the usual 1 to 0
>   is a very welcome optimization for the cases it applies to.)

Inserting an element of a wrong type performs *at least* 1 heap
allocation. Consider:

> ListContainer<WrongType> list; list.reserve(1000); /* insert 1000 elements */

This performs (at least?) 1001 heap allocations with QList and 1 with QVector.

-- 
Giuseppe D'Angelo



More information about the Development mailing list