


Warum haben Lambdas bei der Compileroptimierung einen Inlining-Vorteil gegenüber Funktionen?
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Welche Werte sind von C -Sprachfunktionen zurückgegeben? Was bestimmt den Rückgabewert?

GULC: C -Bibliothek von Grund auf neu gebaut

C Sprachfunktionsformat -Buchstaben -Fall -Konvertierungsschritte

Was sind die Definitionen und Aufrufregeln von C -Sprachfunktionen und was sind die?

Wo ist der Rückgabewert der C -Sprachfunktion im Speicher?

eindeutiger Gebrauch und Phrasenfreigabe

Wie benutze ich Algorithmen aus der STL (sortieren, finden, transformieren usw.) effizient?

Wie funktioniert die C -Standard -Vorlagenbibliothek (STL)?
