Maison > développement back-end > C++ > Pourquoi les compilateurs optimisent-ils mieux les Lambdas que les fonctions simples ?

Pourquoi les compilateurs optimisent-ils mieux les Lambdas que les fonctions simples ?

Mary-Kate Olsen
Libérer: 2024-12-02 02:20:09
original
112 Les gens l'ont consulté

Why Do Compilers Optimize Lambdas Better Than Plain Functions?

Optimisation des fonctions Lambda

Nicolai Josuttis affirme dans "The C Standard Library" que les compilateurs optimisent mieux les lambdas que les fonctions simples. Cela soulève la question de savoir pourquoi c'est le cas.

Optimisation en ligne

On pourrait supposer que l'optimisation en ligne ne ferait pas de différence entre les lambdas et les fonctions simples. Cependant, la principale différence réside dans la nature des lambdas en tant qu'objets de fonction.

Objets de fonction et pointeurs de fonction

Lorsqu'un lambda est transmis à un modèle de fonction, il crée une nouvelle fonction spécifiquement pour cet objet, ce qui entraîne un appel de fonction trivialement inlinable. En revanche, les fonctions simples transmettent des pointeurs de fonction, ce qui pose généralement des problèmes d'optimisation en ligne. Les compilateurs peuvent théoriquement intégrer de tels appels, mais seulement si la fonction environnante est également intégrée.

Exemple

Considérez une carte de modèle de fonction qui prend un itérateur et un objet de fonction comme paramètres :

template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}
Copier après la connexion

Invoquer ce modèle avec un lambda :

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });
Copier après la connexion

Crée une nouvelle instanciation de la fonction :

template <>
void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) {
    for (; begin != end; ++begin)
        *begin = f.operator()(*begin);
}
Copier après la connexion

Le compilateur peut facilement intégrer des appels à l'opérateur() du lambda.

Cependant, lorsque à l'aide d'un pointeur de fonction :

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), &my_function);
Copier après la connexion

L'instanciation résultante devient :

template <>
void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) {
    for (; begin != end; ++begin)
        *begin = f(*begin);
}
Copier après la connexion

Ici, f pointe vers une adresse différente pour chaque appel à map, interdisant l'optimisation en ligne à moins que l'appel à map environnant ne soit également intégré.

Ainsi, l'avantage d'optimisation de lambdas découle de leur capacité à créer des objets de fonction qui permettent des fonctionnalités en ligne triviales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal