7 Stimmen

Funktioniert RVO und Kopiereliminierung nur innerhalb einer Kompilationseinheit oder nicht?

Arbeiten sie über verschiedene Objektdateien hinweg? Arbeiten sie über verschiedene DLLs hinweg?

Ich weiß, dass dies vom Compiler abhängt. Mich interessiert, ob es Compiler und Optimierungseinstellungen gibt, die dies ermöglichen.

3voto

rubenvb Punkte 71669

Normalerweise ja, aber grundsätzlich können der Compiler und der Linker mit Link-Time-Optimierung (-flto für GCC/Clang Compiler und Linker) oder Link-Time-Code-Generation (/LTCG und /GL für den MSVC Compiler und Linker) ihr gemeinsames Wissen nutzen und möglicherweise Code inline einfügen und Kopien vermeiden. Das Handbuch von GCC besagt:

[...] dadurch werden alle interprozeduralen Analysen und Optimierungen in GCC über die beiden Dateien hinweg ausgeführt, als wären sie eine einzige. Das bedeutet beispielsweise, dass der Inliner Funktionen in bar.o in Funktionen in foo.o inline einfügen kann und umgekehrt.

Beachten Sie, dass dies nicht mit DLLs funktioniert, da der Code einer Shared Library fest ist und bereits vollständig kompiliert wurde.

RVO benötigt nur Informationen über die Funktion selbst (da sie den Rückgabewert der Funktion vor Ort konstruiert, anstatt beim return zu kopieren/verschieben. Dies wird wahrscheinlich auch ohne die obigen Optionen funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X