Alle Versuche, effizienten Code in einer anderen Form als Assembly zu schreiben, beruhen sehr, sehr stark auf Compiler-Optimierungen, angefangen bei der einfachsten wie effizienten Registerzuweisung, um überflüssige Stapelüberläufe zu vermeiden, und einer zumindest einigermaßen guten, wenn nicht ausgezeichneten Anweisungsauswahl. Andernfalls wären wir in die 80er Jahre zurückgekehrt, wo wir register
überall Hinweise setzen und die minimale Anzahl von Variablen in einer Funktion verwenden müssten , um archaischen C-Compilern zu helfen, oder sogar früher, als dies goto
eine nützliche Verzweigungsoptimierung war.
Wenn wir uns nicht darauf verlassen könnten, dass unser Optimierer unseren Code optimiert, würden wir alle weiterhin leistungskritische Ausführungspfade in der Assembly codieren.
Es ist wirklich eine Frage der Zuverlässigkeit, mit der Sie die Optimierung durchführen können, die am besten aussortiert werden kann, indem Sie die Fähigkeiten Ihrer Compiler profilieren und untersuchen und möglicherweise sogar disassemblieren, wenn es einen Hotspot gibt, an dem Sie nicht herausfinden können, wo der Compiler sich befindet haben es versäumt, eine offensichtliche Optimierung vorzunehmen.
RVO gibt es schon seit Ewigkeiten, und Compiler wenden es seit Ewigkeiten zuverlässig an, zumindest sehr komplexe Fälle auszuschließen. Es lohnt sich definitiv nicht, ein Problem zu umgehen, das es nicht gibt.
Err auf der Seite, sich auf den Optimierer zu verlassen und ihn nicht zu fürchten
Im Gegenteil, ich würde sagen, dass man sich eher auf Compiler-Optimierungen als auf zu wenig verlässt. Dieser Vorschlag kommt von einem Mann, der in sehr leistungskritischen Bereichen arbeitet, in denen Effizienz, Wartbarkeit und wahrgenommene Qualität bei Kunden sind alles eine riesige Unschärfe. Ich würde es vorziehen, wenn Sie sich zu selbstbewusst auf Ihren Optimierer verlassen und obskure Randfälle finden, in denen Sie sich zu sehr verlassen, als sich auf zu wenig zu verlassen und für den Rest Ihres Lebens nur aus abergläubischen Ängsten zu codieren. Zumindest müssen Sie dann nach einem Profiler greifen und ordnungsgemäß nachforschen, wenn die Dinge nicht so schnell ablaufen, wie sie sollten, und dabei wertvolles Wissen und nicht Aberglauben erwerben.
Es ist gut, sich auf den Optimierer zu stützen. Mach weiter. Werden Sie nicht zu dem Typ, der explizit verlangt, jede in einer Schleife aufgerufene Funktion inline zu setzen, bevor Sie aus Angst vor den Mängeln des Optimierers ein Profil erstellen.
Profiling
Profiling ist wirklich der Kreisverkehr, aber die ultimative Antwort auf Ihre Frage. Das Problem, mit dem Anfänger, die gerne effizienten Code schreiben, häufig zu kämpfen haben, ist, nicht zu optimieren, sondern nicht zu optimieren, da sie alle möglichen fehlgeleiteten Vermutungen über Ineffizienzen entwickeln, die zwar menschlich intuitiv sind, aber rechnerisch falsch. Wenn Sie Erfahrungen mit einem Profiler sammeln, können Sie nicht nur die Optimierungsfunktionen Ihrer Compiler richtig einschätzen, auf die Sie sich sicher verlassen können, sondern auch die Funktionen (sowie die Einschränkungen) Ihrer Hardware. Es ist wohl noch wertvoller, ein Profil zu erstellen, wenn man lernt, was sich nicht zu optimieren lohnt, als zu lernen, was es war.