significado pastillas cummins c inline

pastillas - ¿Cuál es la diferencia entre la función "estática" y "estática en línea"?



inline pastillas (5)

A partir de mi experiencia con GCC, sé que static y static inline difiere en cierto modo de cómo el compilador emite advertencias sobre las funciones no utilizadas. Más precisamente cuando declaras static función static y no se usa en la unidad de traducción actual, el compilador produce una advertencia sobre la función no utilizada, pero puedes inhibir esa advertencia al cambiarla a static inline .

Por lo tanto, tiendo a pensar que la static debe usarse en unidades de traducción y se beneficia del control adicional que hace el compilador para encontrar funciones no utilizadas. Y static inline debe usarse en los archivos de cabecera para proporcionar funciones que puedan alinearse (debido a la ausencia de enlaces externos) sin emitir advertencias.

Desafortunadamente no puedo encontrar ninguna evidencia para esa lógica. Incluso a partir de la documentación de GCC, no pude concluir que inline inhibe las advertencias de funciones no utilizadas. Agradecería si alguien compartiera enlaces a la descripción de eso.

La OMI hace que la función tenga un alcance de unidad de traducción solamente,

¿Cuál es la diferencia entre la función "estática" y "estática en línea"?

ACTUALIZAR

¿Por qué debe ponerse en inline en el archivo de encabezado, no en el archivo .c ?


En C, static significa que la función o variable que defina solo se puede usar en este archivo (es decir, la unidad de compilación)

Por lo tanto, static inline significa la función en línea que se puede utilizar en este archivo solamente.

EDITAR:

La unidad de compilación debe ser The Translation Unit


Por defecto, una definición en línea solo es válida en la unidad de traducción actual.

Si la clase de almacenamiento es extern , el identificador tiene una vinculación externa y la definición en línea también proporciona la definición externa.

Si la clase de almacenamiento es static , el identificador tiene un enlace interno y la definición en línea es invisible en otras unidades de traducción.

Si la clase de almacenamiento no está especificada, la definición en línea solo es visible en la unidad de traducción actual, pero el identificador todavía tiene una vinculación externa y se debe proporcionar una definición externa en una unidad de traducción diferente. El compilador puede usar la definición en línea o externa si la función se llama dentro de la unidad de traducción actual.

Como el compilador es libre de alinear (y no en línea) cualquier función cuya definición sea visible en la unidad de traducción actual (y, gracias a las optimizaciones del tiempo de enlace, incluso en diferentes unidades de traducción, aunque el estándar C en realidad no tiene en cuenta eso), para la mayoría de los propósitos prácticos, no hay diferencia entre las definiciones de funciones en static inline static y static inline .

El especificador en inline (como la clase de almacenamiento de register ) es solo una sugerencia del compilador, y el compilador puede ignorarlo por completo. Los compiladores no optimizadores que cumplen con los estándares solo tienen que cumplir sus efectos secundarios, y la optimización de los compiladores hará estas optimizaciones con o sin consejos explícitos.

inline y register no son inútiles, ya que instruyen al compilador que arroje errores cuando el programador escribe código que imposibilitaría las optimizaciones: una definición en inline externa no puede hacer referencia a los identificadores con enlaces internos (ya que estos no estarían disponibles en otro unidad de traducción) o definir variables locales modificables con duración de almacenamiento estática (ya que no compartirían el estado en unidades de traducción), y no puede tomar direcciones de variables calificadas de register .

Personalmente, utilizo la convención para marcar definiciones de funciones static dentro de encabezados también en inline , ya que la razón principal para poner definiciones de funciones en archivos de encabezado es hacerlas inelicables.

En general, solo utilizo static inline función en static inline y las definiciones del objeto static const además de las declaraciones extern dentro de los encabezados.

Nunca escribí una función en inline con una clase de almacenamiento diferente a la static .


Una diferencia que no está en el nivel de lenguaje, sino en el nivel de implementación popular: ciertas versiones de gcc eliminarán las funciones static inline no referenciadas de la salida de forma predeterminada, pero mantendrán funciones static simples, incluso si no se referencian. No estoy seguro a qué versiones esto se aplica, pero desde un punto de vista práctico, significa que puede ser una buena idea usar siempre en inline para funciones static en los encabezados.


inline ordena al compilador que intente incrustar el contenido de la función en el código de llamada en lugar de ejecutar una llamada real.

Para las funciones pequeñas que se llaman con frecuencia que pueden hacer una gran diferencia de rendimiento.

Sin embargo, esto es solo una "pista", y el compilador puede ignorarlo, y la mayoría de los compiladores intentarán "alinearse" incluso cuando la palabra clave no se use, como parte de las optimizaciones, donde sea posible.

por ejemplo:

static int Inc(int i) {return i+1}; .... // some code int i; .... // some more code for (i=0; i<999999; i = Inc(i)) {/*do something here*/};

Este ciclo cerrado realizará una llamada a función en cada iteración, y el contenido de la función es en realidad significativamente menor que el código que el compilador necesita para realizar la llamada. inline instruirá esencialmente al compilador para convertir el código anterior en un equivalente de:

int i; .... for (i=0; i<999999; i = i+1) { /* do something here */};

Omitir la llamada de función real y devolver

Obviamente, este es un ejemplo para mostrar el punto, no una pieza real de código.

static refiere al alcance. En C significa que la función / variable solo se puede usar dentro de la misma unidad de traducción.