vector.size() im schleifenkopf?



  • also ich hab jetzt folgende schleife

    for(int i=0;i<vector.size();i++)
    

    wird nun nach jedem schleifendurchlauf die länge des vectors neu berechnet?

    wäre es besser

    unsigned int size=vector.size();
    for(int i=0;i<size;i++)
    

    zu schreiben?

    oder optimieren das die compiler so, dass praktisch der erste code benutzt wird, wenn sich der vector während der schleife verändert, und den zweiten wenn der vector (zumindest die grösse) unverändert bleibt?

    lange rede kurtzer sinn, was is besser?



  • wird nun nach jedem schleifendurchlauf die länge des vectors neu berechnet?

    ja wird sie

    wäre es besser
    Code:
    unsigned int size=vector.size();
    for(int i=0;i<size;i++)

    zu schreiben?

    fast!!!
    müsste aber ne warunung geben weil du in der schleife "int" mit "unsigned int" vergleichst. kannst size auch int machen oder i sollte unsigned sein.

    also vorsichtig das erste beispiel nehmen denn mach mal ne schleife mit

    for(unsigned int i=0;i<vector.size();i++){
                    vector.push_back(wert);
    

    denke mal die hört nicht auf 😃 :p

    wenn sich size() nicht ändert ist dass erste kein prob :p



  • size() wird wahrscheinlich nur aus einem return size_des_vectors; bestehen. Das
    kann der Compiler bestimmt optimieren. Was soll denn da berechnet werden?
    Und selbst wenn nicht: Das sind Optimierungsüberlegungen, die man sich schenken
    kann - merken wird man davon nix.



  • öhm, erstens nimm doch bitte für größen size_t und nicht int oder unsigned int. size_t ist nämlich immer so groß, dass es die größte Größenangabe schlucken kann. Mit so spielereien baust du dir auch leicht Integer-Overflow Möglichkeiten ein und die sind extrem schwer zu finden.

    Wenn du es genau wissen willst, solltest du die Geschwindigkeit einfach vergleichen 🙄

    Ansonsten solltest du vielleicht lieber Iteratoren benutzen (?)



  • @kingruedi
    http://www.msoe.edu/eecs/cese/resources/stl/vector.htm

    The size_type type is an unsigned integral value.

    demnach is unsigned int und size_t vom vector ja eh das gleiche oder?

    das ganze is mir nur aufgefallen und ich wollt halt mal nachfragen!

    also danke für eure antworten



  • "unsigned integral type" bedeutet nicht unsigned int! zB. ist unsigned long auch ein "unsigned integral type".

    Bei 32Bit Platformen kommt man idr. mit unsigned int hin (Wenn man unsigned weglässt, passt es schon wieder nicht und man kann nur halbsoviel speichern). Aber zB. auf 64Bit Platformen kann man mit unsigned int Probleme bekommen, da size_t 64Bit groß ist und unsigned int 32Bit.

    Und ich sehe nicht das Problem einfach size_t zu nehmen und alle Probleme sind gegessen.



  • Oder einfach std::vector<type>::size_type nehmen 🙂

    mfg
    v R



  • Ich glaub nicht das der Compiler das vector.size() im Schleifenkopf optimieren kann. Woher soll er wissen ob du in einer nicht trivialen Verarbeitung möglicherweise die Grösse des vectors änderst. Aus diesem Grund würde ich den Aufruf von size() in keinem fall vor die Schleife ziehen, weil es halt zu fehleranfällig ist. Wenn du jedoch immer den Inhalt von 0 bis size-1 verarbeitest sollte die Verwendung von Iteratoren, wie schon vorgeschlagen, keinen Performancenachteil darstellen.

    mfg JJ


Anmelden zum Antworten