Otimização Lambda e funções inline: a vantagem do compilador
A declaração de Nicolai Josuttis de que lambdas exibem otimização superior do compilador em comparação com funções simples tem intrigado muitos desenvolvedores. Investigando essa afirmação, procuramos desvendar as razões subjacentes a essa vantagem de otimização.
Objetos de Função e Inlining
Lambdas sendo objetos de função possuem uma vantagem importante: passá-los para modelos de função acionam a instanciação de uma função personalizada especificamente para esse lambda. Isso permite que o compilador incorpore facilmente a invocação lambda.
Em contraste, as funções empregam ponteiros de função quando passadas para modelos de função. Tradicionalmente, os compiladores enfrentam desafios ao incorporar chamadas por meio de ponteiros de função. A otimização inline só é viável se a própria função envolvente estiver inline.
Instanciações de modelo: explorando a diferença
Para ilustrar essa disparidade, considere o modelo de função de mapa:
templatevoid map(Iter begin, Iter end, F f) { for (; begin != end; begin) *begin = f(*begin); }
Invocando-o com um lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
resulta em uma instanciação personalizada:
template void map(int* begin, int* end, _some_lambda_type f) { for (; begin != end; begin) *begin = f.operator()(*begin); }
O compilador identifica a função _some_lambda_type::operator() e pode fazer chamadas embutidas diretamente para ela. Cada tipo distinto de lambda solicita uma nova instanciação do mapa, garantindo a otimização específica do lambda.
Em contraste, invocar o mapa com um ponteiro de função produz a seguinte instanciação:
template void map(int* begin, int* end, int (*f)(int)) { for (; begin != end; begin) *begin = f(*begin); }
Aqui, o ponteiro de função f aponta para endereços variados para cada chamada de mapa, proibindo a otimização inline. A chamada para map deve ser embutida para que o compilador resolva f para uma função específica.
Assim, a distinção dos lambdas como objetos de função e sua capacidade de facilitar instanciações de modelos capacitam os compiladores com maiores recursos de otimização do que as funções tradicionais invocam através de ponteiros.
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