Lier Vs Lambda?
J'ai une question sur le style préféré: std::bind Vs lambda dans C++0x. Je sais qu'ils servent -en quelque sorte - des fins différentes, mais permet de jeter un exemple de l'intersection de la fonctionnalité.
À l'aide de lambda
:
uniform_int<> distribution(1, 6);
mt19937 engine;
//lambda style
auto dice = [&]() { return distribution(engine); };
À l'aide de bind
:
uniform_int<> distribution(1, 6);
mt19937 engine;
//bind style
auto dice = bind(distribution, engine);
Qui l'on doit-on préférer? pourquoi? en supposant que les situations plus complexes par rapport à l'exemple cité. c'est à dire Quels sont les avantages/inconvénients de l'un sur l'autre?
- existe-il des écarts de performances? la vitesse, la consommation de mémoire, l'utilisation du tas?
- Je ne sais pas vraiment si il y a une différence de performance/consommation de mémoire entre ces deux outils 🙂
- btw: les deux versions ne sont pas équivalentes car lier des copies des arguments. Alternative: bind(ref(distribution),ref(moteur))
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez dit, la reliure et les lambdas ne sont pas tout à fait exactement visent le même objectif.
Par exemple, pour l'aide et de la composition des algorithmes de la STL, les lambdas sont les grands vainqueurs, à mon humble avis.
Pour illustrer, je me souviens vraiment une drôle de réponse, ici, sur un débordement de pile, où quelqu'un a demandé des idées pour de hex numéros de magie, (comme 0xDEADBEEF, 0xCAFEBABE, 0xDEADDEAD etc.) et on m'a dit que si il a été un vrai programmeur C++ il aurait tout simplement de téléchargement d'une liste de mots anglais et de l'utilisation d'un simple one-liner de C++ 🙂
Cet extrait de code, dans le plus pur C++98, ouvrez les mots anglais fichier, l'analyse de chaque mot et de l'impression que ceux qui de longueur 8 avec 'a', 'b', 'c', 'd', 'e' ou 'f' lettres.
Maintenant, tournez sur C++0X et lambda :
C'est encore un peu lourd à lire (principalement en raison de la istream_iterator d'affaires), mais beaucoup plus simple que le bind version 🙂
return <expression>;
seulement(comme Thomas n'a).C++0x lambdas sont monomorphes, tandis que bind peut être polymorphe. Vous ne pouvez pas avoir quelque chose comme
a et b doivent avoir des types connus. D'autre part, tr1/boost/phoenix/lambda bind permet de le faire:
Noter que les types A et B sont pas fixe ici. Seulement si f est en fait utilisé ces deux-là vont être déduite.
template<...>foo(A a, B b, int state){ cout ... << state; } ... auto f = [](const char* a, float b){ foo(a, b, 42); };
.f
avec différents types d'argument, ne le compilateur donner un type d'erreur? Si oui, alors les deux sont monomorphes. C'est juste quelambda
a manifesté de frappe, alors quebind
utilise l'inférence de type.[](auto x){}
bind
ici. Vous pouvez juste direauto f = foo();
.Le C++ 0x lamdba syntaxe est plus lisible que la liaison de la syntaxe. Une fois que vous obtenez dans plus de 2-3 niveau lier, vous code devient assez bien illisible et difficile à maintenir. Je préfère la version plus intuitive lambda syntaxe.
[this](){Type* this_too = this; run([this_too](){this_too->f();});}
est ni lisible ni intuitive.L'un des avantages de lambdas, c'est qu'ils sont plus utiles lorsque vous avez besoin d'ajouter un peu de gros de la logique sur le haut d'une fonction existante.
Avec bind, vous êtes obligé de créer une nouvelle fonction/méthode/foncteur même si la logique n'est jamais nécessaire, dans ce seul endroit. Vous devez venir avec un nom approprié, et il peut rendre le code moins compréhensible dans la mesure où il rend potentiellement diviser la logique.
Avec lambda, vous pouvez ajouter une nouvelle logique à l'intérieur de la lambda (mais ne sont pas obligés de s'il est judicieux de créer un nouveau callable).
[](FILE* f) { if(f) fclose(f); }
, j'ai dû créer un nom de fonction et l'utiliser. La fonction est apparue dans leprivate
partie de la classe, et a donc été séparés par de nombreuses lignes de l'for_each
appelJe pense que c'est plus une question de goût. Les gens que de saisir rapidement de nouvelles technologies, ou sont familiers avec la programmation fonctionnelle préféreront probablement lambda de la syntaxe, tandis que les plus conservatrices, les programmeurs vont définitivement préfèrent lier, car il est plus à la hauteur avec la traditionnelle syntaxe C++.
Une telle décision doit être faite en collaboration avec les personnes qui vont travailler avec le code, probablement par le biais d'un vote à la majorité.
Qui ne change pas le fait, cependant, que la lambda syntaxe est beaucoup plus puissant et plus propre.
C++0x lambdas essentiellement de remplacer les lier. Il n'y a rien que vous pouvez lier que vous ne pouvez pas recréer un trivial wrapper lambda pour atteindre le même. std::tr1::bind va aller dans le sens de std::bind1st, etc une fois que soutien de lambda est très répandue. Ce qui est bon, parce que pour une raison que la plupart des programmeurs ont un moment difficile l'obtention de leur tête autour de la liaison.