Lambdas vs. Bind em C: Polimorfismo e Eficiência
Ao comparar o uso de C 0x lambdas e std::bind para tarefas semelhantes , a escolha entre os dois pode ser influenciada por fatores como polimorfismo e eficiência.
Bind vs. Lambda em detalhes
Considere o exemplo a seguir onde lambda e bind são usados para gerar números aleatórios usando uma distribuição e mecanismo:
// Using lambda auto dice = [&]() { return distribution(engine); }; // Using bind auto dice = bind(distribution, engine);
Polimorfismo
Ao contrário dos lambdas, que são monomórficos (ou seja, têm tipos fixos), std::bind permite polimórficos comportamento. Isso significa que bind pode ser usado para criar funções com tipos desconhecidos, conforme demonstrado abaixo:
struct foo { typedef void result_type; templatevoid operator()(A a, B b) { cout Neste exemplo, os tipos de a e b são deduzidos em tempo de execução quando f é invocado. Essa flexibilidade não está disponível com lambdas.
Eficiência
Em geral, lambdas tendem a ser mais eficientes do que bind quando as variáveis capturadas são usadas por valor. Isso ocorre porque lambdas capturam variáveis diretamente, enquanto bind cria um objeto de fechamento que faz referência às variáveis capturadas. No entanto, bind pode oferecer vantagens quando as variáveis capturadas são grandes ou quando a função é chamada com frequência.
Conclusão
A escolha entre lambdas e bind depende dos requisitos específicos do aplicativo. Lambdas fornecem polimorfismo e são eficientes para capturar pequenas variáveis do tipo valor. Bind oferece maior flexibilidade e pode ser preferível ao lidar com funções grandes ou chamadas com frequência.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3