for Schleife ?



  • btw: Auch MSVC 6sp5 generiert schon folgenden code:

    ; Als Kommentare jeweils die C-Codes dazu
    
    ; int a = 0;
    mov dword ptr [ebp-8], 0
    ; int b = 0;
    mov dword ptr [ebp-0Ch], 0
    
    ; a++;
    mov eax, dword ptr [ebp-8]
    add eax, 1
    mov dword ptr [ebp-8], eax
    
    ; b++;
    mov ecx, dword ptr [ebp-0Ch]
    add ecx, 1
    mov dword ptr [ebp-0Ch], ecx
    

    Ist zwar grundsätzlich compilerabhängig, was daraus jeweils gemacht wird, aber alle aktuellen Compiler sind schon hochoptimierend... *hrm* (o: (nur so als Ergänzung *g*)

    -junix

    [edit]was mich allerdings wundert, ist, dass er nicht direkt inkrementiert.. hmm wär jetzt spanned was der intel-compiler daraus wurschtelt.[/edit]



  • gcc 3.2.2 erzeugt schon ohne Optimierung bei ++i, i++, i+=1 und i=1+i denselben code:

    leal    -4(%ebp), %eax
    incl    (%eax)
    

    (edit: [ code ] rückt irgendwie falsch ein 😕 )



  • Naja, solche simplen Optimierungen kann selbst ein vorsintflutlicher Compiler bei Builtins vornehmen. Aber nichts desto trotz sollte man sich ++i angewöhnen um bei Objekten bei denen der Compiler nicht optimiert nicht einfach aus Gewohnheit postincrement zu verwenden.



  • Was spricht gegen das Post increment?



  • Beim Postinkrement muss erst eine temporäre Variale angelegt werden, die den alten wert speichert und zurück gibt.



  • OT:
    Wenn das Post-Increment über das Pre-Increment implementiert ist, und zwar so:

    inline const A A::operator++(int)
    {
      A old = *this;
      ++(*this);
      return old;
    }
    

    Darf der Compiler die Erstellung und Kopie der Variablen old komplett entfernen, wenn er feststellt, dass der Rückgabewert von operator++ nicht verwendet wird?



  • nur bedingt!
    Der Copy-Konstruktor könnte seiteneffekte haben.



  • Return value optimization entfernt z.B. auch Copy-Konstruktor Aufrufe. Aufrufe des Copy-C'tor werden also nicht garantiert.
    Allerdings funktioniert return value optimization nur bei temporären Objekten, was hier nicht zutrifft.

    Wie ist das in diesem Fall?



  • Er darf die Kopie beim zurückgeben von old wegoptimieren (NRVO), aber nicht die Erzeugung von old.



  • (edit: [ code ] rückt irgendwie falsch ein 😕 )

    du meinst die erste Zeile? mach einfach einenPunkt in die Erste Zeile und fang erst ab der zweitzen an zu schreiben.


Anmelden zum Antworten