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.