[Road for Qt 6] Modifiche ai Container

Chi lavora abitualmente su Qt sa che quello sui container è sempre stato un continuo dibattito a partire dal paragone con la controparte della standard library a quale fosse quello più adatto tra i Qt Containers.

Le idee sono cambiate via via all’interno di Qt stesso, se dal principio fosse indicata QList come quella indicata, dalla versione 5.8 in poi la posizione presa è andata verso QVector, come si può leggere dallo stralcio di documentazione che segue.

QVector should be your default first choice. QVector<T> will usually give better performance than QList<T>, because QVector<T> always stores its items sequentially in memory, where QList<T> will allocate its items on the heap unless sizeof(T) <= sizeof(void*) and T has been declared to be either a a Q_MOVABLE_TYPE  or Q_PRIMITIVE_TYPE using Q_DECLARE_TYPEINFO.

Quindi QVector viene indicata come scelta di default. Però subito dopo prosegue così:

However, QList is used throughout the Qt APIs for passing parameters and for returning values. Use QList to interface with those APIs.

Quindi usa QVector ma se devi interfacciare con le API usa QList. Che quindi diventerebbe la scelta di default de-facto.

Qt 6: unificati QVector e QList

Con la nuova versione di Qt si pone finalmente fine alla diatriba con l’unificazione dei due container, come spiegato nel post ufficiale. L’implementazione interna sarà quella contenuta nell’attuale QVector, mentre la classe ufficiale diventerà QList. QVector sarà d’ora in poi un alias per QList. Le motivazioni sulla convenzione dei nomi sono le seguenti:

  • Semplificazione del porting dato che le maggior parte delle Qt API usano come riferimento QList invece di QVector.
  • Rendere evidente che QVector2D e classi relative non hanno a che fare con QVector (ora QList).
  • Rimanere coerenti con la convenzioni di nomi date da QStringList, QVariantList e QByteArrayList.

Con le nuove QList quindi troveremo le seguenti funzionalità, per lo più incorporate da QVector:

  • Metodi reserve() e squeeze() per rispettivamente preallocare e restringere la memoria allocata da QList.
  • La memoria di una QList non è più limitata a 2 GB.
  • Similarmente a std::vector con size_t, QList utilizzerà qsizetype come tipo anziché un int.
  • QStringList è ora un alias di QList<QString> e non più una classe che eredita da quest’ultima. Sarà comunque presente il metodo join() per unificare la lista in un’unica stringa.

Per ulteriori informazioni si può consultare il post ufficiale e la documentazione di QList di Qt 6.

Per una panoramica completa riguardo i Qt Containers e la differenza con la loro controparte della Standard Library vale la pena leggere l’articolo Understand the Qt containers.

Lascia un commento