2010-09-06 12 views
8

¿Vale la pena usar la palabra clave en línea o el compilador es lo suficientemente inteligente como para saber cuándo necesita alinear una función?C: ¿Vale la pena la palabra clave en línea?

+4

Una observación que no vale la pena responder: si no tiene la intención de utilizar la función desde fuera de la unidad de compilación, la palabra clave "static" hace más para ayudar al compilador que "inline". El compilador puede, por ejemplo, en línea independientemente del tamaño si hay un solo sitio de llamada. –

Respuesta

9

El compilador es bastante inteligente y tiene varias métricas para determinar si algo merece la pena. Pero a veces, sin embargo, el desarrollador tendrá conocimiento sobre cómo se ejecutará la aplicación y sabrá alinear algo que el compilador no hace automáticamente. Sin embargo, nunca pondría las cosas en línea manualmente a menos que haya hecho algunos puntos de referencia y descubrí que en línea mejoraría mi rendimiento.

Puede leer más sobre GCC uses inline.

3

Siempre vale la pena ser explícito sobre la intención.

También vale la pena señalar que el compilador ni siquiera necesita alinearse si cree que es mejor no hacerlo.

13

Sí, es lo suficientemente inteligente. Pero lo que no ha logrado ningún progreso en los últimos 40 años es la forma en que se crean los programas de C. Todavía es un archivo de código fuente a la vez.

Para obtener una función en línea en más de un archivo .c, coloca la definición de función en el archivo .h. Y si no los marca en línea, el vinculador se quejará de las múltiples definiciones.

+2

+1, 'en línea' hoy en día significa" permitir definiciones múltiples ". El hecho de que también es una sugerencia para el compilador "hacer que llamar a esta función sea rápido" es un efecto secundario irrelevante e irrelevante :-) Creo que no es que "la forma en que se crean los programas" no haya avanzado: algunos compiladores/vinculadores tener. Pero el mínimo común denominador, que permite el estándar, no ha avanzado. –

+9

Decir 'en línea' significa "permitir definiciones múltiples" es simplemente incorrecto. Esta pregunta es sobre el lenguaje C, no sobre C++. C no tiene funciones 'extern inline', la palabra clave' inline' no es válida sin 'static', y nunca se permiten múltiples definiciones de una función. –

0

La norma dice

7.1.2 Función especificadores

2.   Una declaración de la función (8.3.5, 9.3, 11.4) con un comitente en línea declara una función en línea. El especificador en línea indica a la implementación que la sustitución en línea del cuerpo de la función en el punto de llamada es preferible al mecanismo de llamada de función habitual. No se requiere una implementación para realizar esta sustitución en línea en el punto de llamada; sin embargo, incluso si esta sustitución en línea se omite, las otras reglas para las funciones en línea definidas en 7.1.2 se seguirán respetando.

Así que me comparo inline a tal <br /> en HTML - es una buena práctica utilizar el auto-cierre <br /> todo el tiempo. Pero se podría argumentar que casi todas las implementaciones del navegador tratan <br> y <br /> exactamente lo mismo, lo que IMO pasa por alto.

Como han notado otros, esto probablemente no sea muy relevante para el valor de rendimiento en estos días. Pero creo que todavía funciona muy bien como palabra clave semántica que transmite la intención.