2009-10-10 17 views
19

Me refiero a this discussion. Nunca he escrito ningún código en C o en C++. No tengo ningún fondo CS. Sin embargo, he estado trabajando como desarrollador de Java durante 5 años y ahora he decidido aprender más sobre CS y ponerme al día.¿Qué está en línea?

+0

Un duplicado de C# world http://stackoverflow.com/questions/648409/inlining-functions, pero creo que las respuestas aquí son mejores – nawfal

Respuesta

27

Cuando se ejecuta un código dado, cada vez que se llama a una función estándar, el tiempo de ejecución es un poco más alto que el que arroja el código contenido en esa función. Volcar cada vez que todo el código contenido en una función está en el otro extremo inmanejable porque obviamente lleva a un lío completo de duplicación de código.

Inlining resuelve el problema de rendimiento y facilidad de mantenimiento al permitir que se declara la función como línea (al menos en C++), de manera que cuando se llama a esa función - en lugar de tener su aplicación saltando en tiempo de ejecución - el código en la función en línea se inyecta en tiempo de compilación cada vez que se llama a esa función dada.

desventaja de esto es que - si usted inline grandes funciones que se llama a un montón de veces - el tamaño de su programa puede aumentar significativamente ( mejores prácticas sugieren que hacerlo sólo en pequeñas funciones de hecho).

11

http://en.wikipedia.org/wiki/Inlining

En informática, la expansión en línea, o procesos en línea, es una optimización del compilador que reemplaza un sitio llamada a la función con el cuerpo del destinatario de la llamada. Esta optimización puede mejorar el uso de tiempo y espacio en tiempo de ejecución, al costo posible de aumentar el tamaño del programa final.

0

Básicamente, en C/C++, el compilador puede alinear funciones, lo que significa que en lugar de hacer una llamada de función para hacer esa operación, el código se agregará al bloque de la función de llamada, por lo que será como si tuviera nunca ha sido una llamada de función separada.

Esto entrar en más detalles: http://www.codersource.net/cpp_tutorial_inline_functions.html

0

Inlining se refiere a la optimización en tiempo de compilación en la que se inyecta una pequeña función de código en la función de llamada en lugar de requerir una llamada independiente.

2

Como ya se ha mencionado en otras respuestas, la inclusión tiene un costo. Por lo general, esto se considera pequeño, sin embargo, al medirlo, es posible que se sorprenda y sepa que puede ser mayor que lo que gana (para que what other people say sea cierto: no optimice a menos que haya medido).

Vale la pena señalar que en el kernel de Linux comenzaron a desincluir originalmente funciones en línea hace algún tiempo porque el costo era demasiado alto (funciones más grandes consumían más memoria caché de la CPU, y las fallas de caché resultantes eran más caras que simplemente llamando a la función que se pretendía incluir). Consulte "Capítulo 15: La enfermedad en línea" en doc/Documentation/CodingStyle para obtener más detalles.

+0

Buen punto y un buen ejemplo de cómo pueden influir los desarrollos de hardware (en este caso: invalidar) técnicas de software - El ancho de banda de la memoria no se ha mantenido con la velocidad de la CPU, por lo que cualquier cosa que intente cambiar el consumo de memoria para los ciclos de la CPU puede volverse contraproducente. –

+0

Sí, es un buen punto, y esto es lo que siempre me atrae del diseño y api del compilador: ¿qué estamos obteniendo si se discute y traduce el "código pequeño y ajustado" por personas que no tienen una comprensión intuitiva de cómo funciona la maquinaria? Los dispositivos computacionales son maquinaria de computación, solo maquinaria, nada más. Entonces, si la seguridad a través de la oscuridad es popular, podemos probarlo por una proliferación de discusiones de diseño que piensan que los detalles están sucios. –

0

Las respuestas de optimización del compilador son correctas. Sin embargo, hay otro uso: en refactoring, inline se refiere a reemplazar una llamada de método por el cuerpo del método y luego eliminar el método. Ver Inline Method. Hay refactorizaciones similares, como Inline Class.

EDITAR: tenga en cuenta que la refactorización se realiza manualmente o con una herramienta; en cualquier caso, implica cambiar el código fuente.

6

Como desarrollador de Java, generalmente no tiene que preocuparse por la alineación de métodos.El compilador Just-in-time de Java puede hacerlo y lo hará automáticamente en la mayoría de los lugares donde tenga sentido.

IDEs como Eclipse pueden tener una característica que le permite Inline métodos a nivel de código fuente - Nunca hacer esto para el rendimiento, sólo para la legibilidad del código (por ejemplo, cuando se da cuenta de que el método sólo llama a otro método sin añadir algo útil en sí mismo).

+0

Sí, como desarrollador de Java, nunca tengo que preocuparme por eso. Pero estoy tratando de aprender aquí y me estaba preguntando qué es ininling. – Roger

-1

En esa discusión, Jon Skeet menciona Client jvm (hotspot) v Servidor jvm con las mejoras de rendimiento disponibles en tiempo de ejecución si el compilador JIT (just-in-time) puede incorporar mejoras basadas en el tiempo. Eso es "cómo se hace" en Java.

Originalmente, pequeñas secciones de código que no se llamaban desde muchos lugares serían "insertadas" por el compilador, lo que significa que lo que se llamaba singleton se colocaría directamente en la ruta del código del puntero de instrucción, haciendo una rama de función y retorno cuesta más potencia de procesador que simplemente desenrollar para hacer bucles o llamar a funciones y colocar las instrucciones "allí"

Hoy, Singleton es el tema de discusiones de varias páginas y el desenrollado de bucles, así como algo así como inline están algo alejados de su contexto (es) original (es). Puede leer el trabajo muy informado de Dov Bulka sobre el tema para que el C/C++ se encargue del asunto. Para Java, el estudio de sus ricas libs en java.util responderá mejor a sus necesidades que el estudio de intrincados y profundos problemas del compilador: puede verse involucrado en una guerra intramuros arraigada en las estructuras de datos, que borran las llamadas en código de 16 bits, y no tiene fin en su curva de aprendizaje.

Puede hacer instanceof en Java, que se asemeja a una tabla vf (sin gente del calor, por favor) pero piense en ello ya que ha estado escribiendo en un lenguaje fuertemente tipado, y ahora estará escribiendo en un idioma donde fugitivo fugarse fácilmente donde no tiene ningún negocio. Hace poco intenté escribir un código que construyera una Imagen en Java, haciendo eso desde el código C. Pronto me encontré mirando la tabla de oxr para una encriptación fuerte, eso no tiene nada que ver con el código que estaba escribiendo.

¿Cómo escribiría una clase de cadena en C/C++ que tiene un pequeño búfer para las cadenas de menos de 32 bytes y atrapa los punteros para que solo operen en la cadena?

No tratando de molestarlo ni nada, es simplemente un buen lugar para comenzar en lugar de crear y compilar la ciencia.

0

Las funciones en línea se usan normalmente en archivos de encabezado C++, no en Java. Un archivo de encabezado C++ generalmente no contiene código implementado y se considera una interfaz para el archivo cpp del mismo nombre, que generalmente contiene el código implementado. Es legal incluir una función en línea en un archivo de encabezado, generalmente una función pequeña y liviana. Las funciones en línea tienen un costo, por lo que no deberían ser grandes operaciones de memoria intensiva. Para rutinas pequeñas, el rendimiento alcanzado es mínimo y se usan más por conveniencia.

Cuestiones relacionadas