Heim >Backend-Entwicklung >C++ >Warum optimieren Compiler Lambdas besser als einfache Funktionen?

Warum optimieren Compiler Lambdas besser als einfache Funktionen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-02 02:20:09115Durchsuche

Why Do Compilers Optimize Lambdas Better Than Plain Functions?

Lambda-Funktionsoptimierung

Nicolai Josuttis behauptet in „The C Standard Library“, dass Compiler Lambdas besser optimieren als einfache Funktionen. Dies wirft die Frage auf, warum das so ist.

Inline-Optimierung

Man könnte annehmen, dass die Inline-Optimierung nicht zwischen Lambdas und einfachen Funktionen unterscheiden würde. Der Hauptunterschied liegt jedoch in der Natur von Lambdas als Funktionsobjekte.

Funktionsobjekte vs. Funktionszeiger

Wenn ein Lambda an eine Funktionsvorlage übergeben wird, wird es erstellt eine neue Funktion speziell für dieses Objekt, was zu einem trivial inlinierbaren Funktionsaufruf führt. Im Gegensatz dazu übergeben einfache Funktionen Funktionszeiger, die typischerweise Probleme bei der Inline-Optimierung verursachen. Compiler können solche Aufrufe theoretisch inline, aber nur, wenn die umgebende Funktion ebenfalls inline ist.

Beispiel

Stellen Sie sich eine Funktionsvorlagenzuordnung vor, die einen Iterator und ein Funktionsobjekt als akzeptiert Parameter:

template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}

Aufrufen dieser Vorlage mit a lambda:

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });

Erstellt eine neue Instanziierung der Funktion:

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 kann den Operator() des Lambda problemlos inline aufrufen.

Jedoch wann unter Verwendung eines Funktionszeigers:

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), &my_function);

Die resultierende Instanziierung wird zu:

template <>
void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}

Hier zeigt f auf eine andere Adresse für jeden Map-Aufruf, was eine Inline-Optimierung verhindert, es sei denn, der umgebende Map-Aufruf ist ebenfalls inline.

Daher ist der Optimierungsvorteil von Lambdas beruhen auf ihrer Fähigkeit, Funktionsobjekte zu erstellen, die triviale Inline-Funktionen ermöglichen.

Das obige ist der detaillierte Inhalt vonWarum optimieren Compiler Lambdas besser als einfache 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