-Wmarc.

-Wmarc.

Marc Mutz pa Qt, Boost, og C ++

Merket med QSharedPointer.

Sneak Preview: QList anses skadelig.

[[EDIT 2011-08-15: Dette har siden blitt utvidet til en full effektiv Qt-kolonne.]]

Vi visste i lang tid at QList ikke er en god standardbeholder, til tross for hva dokumentasjonen hevder. Problemet koker ned til det faktum at for mange typer T, QList & lt; T & gt; er unodvendig ineffektiv ved a tildele elementer pa bunken og lagre pekere til dem i stedet for a lagre elementene pa plass, for eksempel f.eks. QVector gjor. Noen ganger, for store og komplekse typer, kan det v re akkurat det du vil, men et konservativt estimat vil sette sjansen pa mindre enn 5%.

Det slutter aldri a forundre meg hvordan folk trent i STL-standarden til std :: vector til en profiler forteller dem at de skal bruke en std :: -liste eller std :: deque istedenfor, mens folk trent i Qt-standard til QList og ikke QVector .

Effektiv Qt vil snart komme ut med alle gory detaljer, men siden KDE 4.5 og Q4 4.7 utgivelser er n rt forestaende, bestemte jeg meg for a gi deg et forgrunnsvisning av hvor utbredt denne ineffektiviteten er. For a gjore det, endelig satte jeg meg ned og utviklet en oppdatering som gir en advarsel nar du prover a legge til noe pa en ineffektiv QList (i hvert fall hvis du setter kompilatoren din til a advare om signerte / usignerte integer-sammenligningsadvarsler). Den er utviklet og testet med GCC 4.3 og Qt 4.6.3, men skal ogsa fungere for mange andre kompilatorer. Vennligst send meg advarsel generatorer for kompilatoren din i kommentarer.

Patchen er bin rkompatibel, slik at du ikke ma kompilere Qt etter at du har brukt den.

Her er en (ufullstendig) liste over ineffektive bruksomrader for QList (i folgende, T og S er vilkarlig type):

QVariant (!!) er for stor. QVector & lt; T & gt; er ikke merket som bevegelig, selv om det er. QSharedPointer & lt; T & gt; er for stor. Nesten alle QPair & lt; T, S & gt; er for stor. Enums ikke merket som bevegelig.

Kjor, ikke ga, og reparer det nye API-en for a ikke bruke QList, eller merk dine nye typer som bevegelige (detaljer er i oppdateringen). Alas, begge endringene er bin re inkompatible, sa du kan ikke gjore dem hvis du trenger koden din for a forbli BC. Dette kan v re en av grunnene til at QPair og QVector er “fast & # 8221; likevel: a gjore det ville endre layoutet av QListen instantiated med dem :(.

Men i det minste for ny kode, er det ingen unnskyldning lenger: Bruk bare oppdateringen.


Vil du spille i det beste kasinoet? Vi fant det for deg. Trykk her nå!