rust inline

¿Cuándo debe usarse en línea en Rust?



inline (1)

Una limitación del compilador Rust actual es que si no está utilizando LTO (Link-Time Optimization), nunca integrará una función que no esté marcada #[inline] todas las cajas. Rust utiliza un modelo de compilación por separado similar a C ++ porque la implementación de LTO de LLVM no se adapta bien a proyectos grandes. Por lo tanto, las funciones pequeñas expuestas a otras cajas deben marcarse a mano. Esta no es una gran situación, y es probable que se solucione en el futuro mediante una combinación de mejoras en las incorporaciones de LTO y MIR.

#[inline(never)] veces es útil para la depuración (separar un fragmento de código que no funciona como se esperaba). En teoría, se puede usar para la evaluación comparativa, pero generalmente es una mala idea: desactivar la incorporación no impide otras optimizaciones entre procedimientos como la propagación constante. En términos de código normal, puede reducir el tamaño del código si tiene una función auxiliar de uso frecuente que solo se utiliza para el manejo de errores.

#[inline(always)] es generalmente una mala idea; si una función es lo suficientemente grande como para que el compilador no la inscriba de forma predeterminada, es lo suficientemente grande como para que la sobrecarga de la llamada no importe (y el aumento excesivo de la línea de instrucciones aumenta la presión). Hay excepciones, pero necesita mediciones de rendimiento para justificarlo. https://github.com/rust-lang/rust/commit/274bb24efdbeed0ab1a91f3c02f86551ef16eac7 es el tipo de situación en la que vale la pena considerar. #[inline(always)] también se puede usar para mejorar la calidad del código -O0, pero por lo general no vale la pena preocuparse.

El óxido tiene un atributo "en línea" que se puede usar en uno de esos tres sabores:

#[inline]

#[inline(always)]

#[inline(never)]

¿Cuándo deberían ser utilizados?

En la referencia de Rust, vemos una sección de atributos en línea que dice

El compilador integra automáticamente funciones basadas en heurísticas internas. Las funciones de alineación incorrectas en realidad pueden hacer que el programa sea más lento, por lo que debe usarse con cuidado.

En el foro interno de Rust, huon también fue conservador en cuanto a especificar en línea .

Pero vemos un uso considerable en la fuente de Rust, incluida la biblioteca estándar. Una gran cantidad de atributos en línea se agregan a las funciones de una línea, lo que debería ser fácil para los compiladores de detectar y optimizar a través de heurísticas de acuerdo con la referencia. ¿De hecho no son necesarios?