El efecto de auto en el tiempo de compilación

El efecto de auto en el tiempo de compilación

El auto La palabra clave de C++11 es mucho menos pesada que las plantillas:su "sobrecarga" en tiempo de compilación es comparable a la de sizeof , lo que significa que está cerca de cero.

A diferencia de las plantillas en las que el compilador necesita realizar una cantidad considerable de cálculos durante la expansión (el lenguaje de plantilla en C++ es Turing-completo), el auto La palabra clave requiere que el compilador descubra el tipo de una expresión, que es algo que el compilador sabe de todos modos. De hecho, tendría que averiguar el tipo de expresión incluso sin el auto palabra clave para decidir si es necesario aplicar conversiones de tipo.


Lo que la mayoría de la gente quiere decir con "inflación de plantilla" es un mito. Una plantilla instanciada dos veces produce no más código que dos funciones separadas que manejan esos mismos tipos. Si crea instancias de la plantilla miles de veces, obtendrá mucho código, pero si escribe miles de funciones, obtendrá la misma cantidad de código (consulte Plantillas de dieta para conocer algunas formas genuinas de definir sin cuidado las plantillas pueden llevar a algunos "hinchar".) Las plantillas pueden afectar el tiempo de compilación, pero eso no es "inflado".

El auto la palabra clave es no una plantilla, utiliza las mismas reglas de deducción de tipos que las plantillas, pero si escribe auto i = 1; solo hay una "instanciación", es decir, el auto solo tiene que deducir un tipo, y produce exactamente el mismo código como int i = 1; así que no puede haber ninguna hinchazón. Es solo una sintaxis alternativa para declarar una variable. Cero hinchazón.

Ahora las lambdas polimórficas son diferentes, definen un tipo con una plantilla de función miembro operator() , por lo que cada vez que llame al operator() del cierre con diferentes tipos de argumentos, instanciará otra especialización de la plantilla de función, pero eso no tiene nada que ver con auto , el uso de auto es solo sintaxis para declarar una plantilla. Si lo llama miles de veces, obtendrá mucho código generado, pero no más que si usara miles de expresiones lambda diferentes para los tipos específicos que usa (es casi seguro que obtendrá menos código con el lambda genérico, porque solo hay un cierre escriba menos RTTI y escriba nombres para que el compilador los cree y almacene en la memoria).