Warum Lambdas Funktionen in der Compiler-Optimierung übertreffen
In seinem Buch „The C Standard Library (Second Edition)“ behauptet Nicolai Josuttis, dass Lambdas Genießen Sie im Vergleich zu gewöhnlichen Funktionen eine überlegene Compiler-Optimierung. Diese Unterscheidung ergibt sich aus der Natur von Lambdas als Funktionsobjekten und ermöglicht die Instanziierung von Funktionsvorlagen, die auf bestimmte Lambda-Objekte zugeschnitten sind.
Inlining-Vorteil für Lambdas
Im Gegensatz zu einfachen Funktionen, die Übergeben Sie Funktionszeiger an Funktionsvorlagen, Lambdas werden als Funktionsobjekte übergeben. Dies löst die Erstellung einer neuen Funktion aus, die auf das spezifische Lambda-Objekt zugeschnitten ist. Dadurch kann der Compiler den Lambda-Aufruf mühelos einbinden.
Funktionszeiger-Behinderung
Im Gegensatz dazu werden Funktionen durch ihren Übergabemechanismus in Funktionsvorlagen behindert. Compiler stehen vor Herausforderungen beim Inlining von Aufrufen, die über Funktionszeiger erfolgen. Während theoretisches Inlining möglich ist, erfordert es auch das Inlining der umschließenden Funktion.
Instantiierungsbeispiel
Betrachten Sie die Funktionsvorlage „map“ unten:
template <typename Iter, typename F> void map(Iter begin, Iter end, F f) { for (; begin != end; ++begin) *begin = f(*begin); }
Aufrufen von „map“ mit a Lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
Generiert die folgende Instanziierung:
template <> void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) { for (; begin != end; ++begin) *begin = f.operator()(*begin); }
Der Compiler identifiziert den Operator() des Lambda und kann ihn mühelos inline aufrufen.
Jedoch wann „map“ wird mit einem Funktionszeiger aufgerufen:
template <> void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
Der Funktionszeiger „f“ zeigt bei jedem Aufruf von „map“ an einen anderen Ort, was es für den Compiler schwierig macht, nur „f“-Aufrufe zu inline. Beim Inlining muss auch der umfassende „map“-Aufruf eingebunden werden, damit der Compiler die spezifische Funktion ermitteln kann, auf die „f“ zeigt.
Das obige ist der detaillierte Inhalt vonWarum haben Lambdas bei der Compileroptimierung einen Inlining-Vorteil gegenüber Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!