qt foreach



  • l'abra d'or schrieb:

    Janjan schrieb:

    Unnötige Mikrooptimierung.

    Es ist prinzipiell keine unnötige Mikrooptimierung, wenn man sich Werte, die man öfters unverändert braucht, zwischenspeichert.
    Ein QList::end() kann übrigens ziemlich teuer werden, schau dir den Code an.

    Prinzipiell magst du schon recht haben, der Profiler von VS2008 sagt aber dass es keinerlei Unterschied macht.
    Ich denke die meisten Compiler sind durchaus intelligent genug zu erkennen dass die Liste in der Schleife nicht verändert wird und das end() selbst auszulagern.



  • rean schrieb:

    Ich denke die meisten Compiler sind durchaus intelligent genug zu erkennen dass die Liste in der Schleife nicht verändert wird und das end() selbst auszulagern.

    Und genau das ist der Fall. Das Optimieren sollte man dem Compiler überlassen - er macht es sowieso besser.



  • Janjan schrieb:

    Also wechsel einfach auf eine Lösung mittels Iteratoren.

    nein, lieber einfach foreach durch BOOST_FOREACH austauschen. Dann gehen auch Referenzen. Und noch mehr (bis aufs verändern der Sequenz)



  • Wozu boost, wenn er Qt benutzt?



  • zum Beispiel um ein besseres foreach zu bekommen



  • "Besser" ist wohl Geschmackssache. Ich halte generell von solchen Makros nichts.



  • nee, mit Geschmack hat das nichts zu tun.

    Mit boost geht:

    int v[] = {1,2,3};
    foreach (int x, v) ...
    foreach (int& x, v) ...
    foreach (const int& x, v) ...
    

    Mit QT glaube ich keins von denen. Also ist die Boost-Variante klar besser.



  • Janjan schrieb:

    "Besser" ist wohl Geschmackssache. Ich halte generell von solchen Makros nichts.

    Ich halte generell nicht von allgemeine Verteufelungen 🙂 Abgesehen sind Guards auch Makros *hust**hust*



  • Zeus schrieb:

    Janjan schrieb:

    "Besser" ist wohl Geschmackssache. Ich halte generell von solchen Makros nichts.

    Abgesehen sind Guards auch Makros *hust**hust*

    *hust**hust* Guards sind auch kein solches Makro wie hier beschrieben. Lesen ist hilfreich. *hust**hust*

    DrGreenthumb schrieb:

    nee, mit Geschmack hat das nichts zu tun.

    Mit boost geht:

    int v[] = {1,2,3};
    foreach (int x, v) ...
    foreach (int& x, v) ...
    foreach (const int& x, v) ...
    

    Mit QT glaube ich keins von denen. Also ist die Boost-Variante klar besser.

    Und du weißt jetzt aus dem FF was die Voraussetzungen für dieses Makro sind? Worauf greift es zu?



  • die liste muss ein array oder ein container mit begin()/end() und den üblichen typedefs sein. Ansonsten beschwert sich schon der compiler.


Anmelden zum Antworten