Optimización de Lambda y funciones en línea: la ventaja del compilador
La afirmación de Nicolai Josuttis de que las lambdas exhiben una optimización del compilador superior en comparación con las funciones simples ha intrigado a muchos desarrolladores. Al investigar esta afirmación, buscamos desentrañar las razones subyacentes detrás de esta ventaja de optimización.
Objetos de función e inserción
Las lambdas, al ser objetos de función, poseen una ventaja clave: pasarlas a Las plantillas de funciones desencadenan la creación de instancias de una función personalizada específicamente para esa lambda. Esto permite al compilador alinear sin esfuerzo la invocación lambda.
Por el contrario, las funciones emplean punteros de función cuando se pasan a plantillas de funciones. Tradicionalmente, los compiladores encuentran desafíos al insertar llamadas a través de punteros de función. La optimización en línea es factible solo si la función adjunta en sí está incorporada.
Instanciaciones de plantilla: explorando la diferencia
Para ilustrar esta disparidad, considere la plantilla de función de mapa:
templatevoid map(Iter begin, Iter end, F f) { for (; begin != end; begin) *begin = f(*begin); }
Invocarlo con una lambda:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
da como resultado una creación de instancias personalizada:
template void map(int* begin, int* end, _some_lambda_type f) { for (; begin != end; begin) *begin = f.operator()(*begin); }
El compilador identifica la función _some_lambda_type::operator() y puede incorporar llamadas directamente a ella. Cada tipo de lambda distinto genera una nueva instanciación del mapa, lo que garantiza una optimización específica de lambda.
Por el contrario, invocar el mapa con un puntero de función produce la siguiente instanciación:
template void map(int* begin, int* end, int (*f)(int)) { for (; begin != end; begin) *begin = f(*begin); }
Aquí, el puntero de función f apunta a diferentes direcciones para cada llamada de mapa, lo que prohíbe la optimización en línea. La llamada a map debe estar insertada para que el compilador resuelva f en una función específica.
Por lo tanto, el carácter distintivo de las lambdas como objetos de función y su capacidad para facilitar la creación de instancias de plantillas otorga a los compiladores mayores capacidades de optimización que las que invocan las funciones tradicionales. a través de punteros.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3