¿Cuándo debo usar __forceinline en lugar de en línea?

4 minutos de lectura

avatar de usuario
Michael Labbé

Visual Studio incluye soporte para __forceinline. La documentación de Microsoft Visual Studio 2005 dice:

La palabra clave __forceinline anula el análisis de costo/beneficio y, en cambio, se basa en el juicio del programador.

Esto plantea la pregunta: ¿Cuándo es incorrecto el análisis de costo/beneficio del compilador? Y, ¿cómo se supone que voy a saber que está mal?

¿En qué escenario se supone que sé mejor que mi compilador sobre este tema?

Usted sabe mejor que el compilador solo cuando los datos de su perfil así lo indican.

  • Debería ser la mejor respuesta 😉

    – aaronsnoswell

    23 de octubre de 2017 a las 6:13

  • Si bien esta respuesta tiene un buen punto, no dice nada sobre la inserción.

    – programador

    19 de marzo de 2021 a las 16:54

El único lugar que estoy usando es la verificación de licencia.

Un factor importante para protegerse contra el descifrado fácil* es verificar que tiene licencia en varios lugares en lugar de solo uno, y no desea que estos lugares tengan la misma llamada de función.


*) Por favor, no conviertas esto en una discusión en la que todo se puede descifrar, lo sé. Además, esto solo no ayuda mucho.

  • Estoy planeando usar __foceinline por la misma razón. ¿Puede estar seguro al 100% de que estará en línea cuando use __forceinline? Tengo dudas ya que msdn también dice: “No puede obligar al compilador a alinear una función en particular, incluso con la palabra clave __forceinline”.

    – mentat

    1 de junio de 2011 a las 7:04

  • @Koray: debe verificar el código generado. En mi experiencia, sí, ti funciona incluso para funciones gigantescas. Una excepción (IIRC) son las funciones con argumentos variables, y es probable que la documentación se refiera a eso.

    – peterchen

    23 de junio de 2011 a las 14:25

  • @mentat: No puedes estar 100% seguro, pero puedes dejarte advertir. La advertencia C4714 lo hará: es una advertencia de nivel 4 de depuración, por lo que, según su configuración, debe habilitarse explícitamente.

    – Galleta

    18/09/2017 a las 14:31

  • @peterchen otra posibilidad es que los documentos simplemente tengan en cuenta el hecho de que las funciones recursivas (por lo general) no se pueden alinear completamente en sí mismas

    – hanshenrik

    25 de septiembre de 2019 a las 18:58


El compilador toma sus decisiones basándose en el análisis de código estático, mientras que si perfila como dice don, está llevando a cabo un análisis dinámico que puede tener un alcance mucho mayor. El número de llamadas a una pieza de código específica suele estar determinado en gran medida por el contexto en el que se utiliza, por ejemplo, los datos. Perfilar un conjunto típico de casos de uso hará esto. Personalmente, recopilo esta información habilitando la creación de perfiles en mis pruebas de regresión automatizadas. Además de forzar las líneas, he desenrollado bucles y llevado a cabo otras optimizaciones manuales sobre la base de dichos datos, con buenos resultados. También es imperativo volver a crear un perfil después, ya que a veces sus mejores esfuerzos pueden conducir a una disminución del rendimiento. Nuevamente, la automatización hace que esto sea mucho menos doloroso.

Sin embargo, la mayoría de las veces, en mi experiencia, ajustar los algoritmos da resultados mucho mejores que la optimización directa del código.

He desarrollado software para dispositivos de recursos limitados durante aproximadamente 9 años y el solamente vez que he visto la necesidad de usar __forceinline estaba en un bucle cerrado en el que un controlador de cámara necesitaba copiar datos de píxeles desde un búfer de captura a la pantalla del dispositivo. Allí pudimos ver claramente que el costo de una llamada de función específica realmente acaparó el rendimiento del dibujo superpuesto.

La única forma de estar seguro es medir el rendimiento con y sin. A menos que esté escribiendo código crítico de alto rendimiento, esto generalmente será innecesario.

avatar de usuario
Pronto

Para código SIMD.

El código SIMD a menudo usa constantes/números mágicos. En una función regular, cada const __m128 c = _mm_setr_ps(1,2,3,4); se convierte en una referencia de memoria.

Con __forceinlineel compilador puede cargarlo una vez y reutilizar el valor, a menos que su código agote los registros (generalmente 16).

Los cachés de la CPU son excelentes, pero los registros son aún más rápidos.

PD Acabo de obtener una mejora del rendimiento del 12 % al __forceinline solo.

La directiva en línea será totalmente inútil cuando se use para funciones que son:

recursivo, largo, compuesto de bucles,

Si quieres forzar esta decisión usando __forceinline

¿Ha sido útil esta solución?