c - ¿Inline tiene algún efecto cuando se utiliza el atributo de función constante?

CorePress2024-01-24  8

Toma esta función

__attribute_const__ static inline int mul(int a, int b)
{
    return a * b;
}

contra este

__attribute_const__ static int mul(int a, int b)
{
    return a * b;
}

¿Existe alguna razón para utilizar inline cuando se utiliza un atributo constante? ¿Ayuda en algo al compilador utilizar inline aquí?

Me parecen ortogonales.

- jwdonahue

27 de marzo de 2021 a las 1:40



------------------------------------

Ninguno de los atributos necesariamente ayuda aquí, porque una función estática estaría incorporada de todos modos.Sin embargo, en línea si el compilador así lo decide, y debido a que es una función estática, entonces la fuente estaría presente en la unidad de traducción donde se usaría, entonces el compilador también puede ver que calcula el producto de los dos argumentos y los compiladores están lo suficientemente inteligente como para concluir que el producto de dos argumentos depende sólo de los valores de esos argumentos.

El caso en línea se vuelve más interesante en el caso de en línea/externo en línea. Además, el caso del atributo se vuelve más interesante cuando el compilador no puede ver el código (porque la función está definida solo en otra unidad de traducción) o no puede deducir su comportamiento correctamente; por ejemplo, una función constante podría tocar algunas tablas de búsqueda comunes inicializadas al principio. del programa, pero el compilador no podría garantizar queque permanecerán constantes.



------------------------------------

Las funciones en línea se sustituyen donde se llaman (en el momento de la compilación) y el atributo const le dice al compilador que se podrían evitar más llamadas a la función usando los mismos parámetros, porque el resultado será el mismo. Si marca la función constante como en línea, entonces está perdiendo el comportamiento constante ya que la función en línea no es per se una "llamada" y la optimización constante se basa en llamadas repetidas

1

El atributo en línea cambia el vínculo de la función. No hace que el compilador sustituya la función donde se llama (sólo sirve como una pista que normalmente se ignora). Incluso si el compilador sustituye la llamada a la función, esto no entra en conflicto con las funciones de atributo (const) porque el compilador puede simplemente evitar sustituir la llamada a la función en la segunda llamada, del mismo modo que podría evitar realizar la llamada a la función.

- interjay

27 de marzo de 2021 a las 8:55

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare