Heim >Backend-Entwicklung >C++ >Warum haben Lambdas bei der Compileroptimierung einen Inlining-Vorteil gegenüber Funktionen?

Warum haben Lambdas bei der Compileroptimierung einen Inlining-Vorteil gegenüber Funktionen?

Susan Sarandon
Susan SarandonOriginal
2024-11-16 22:55:03751Durchsuche

Why do Lambdas have an Inlining Advantage Over Functions in Compiler Optimization?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn