2011-10-23 11 views
5

Tengo una clase cnVector que representa un punto en el espacio tridimensional. Sus operadores + - */se usan intensamente.
Su aplicación es muy corto:¿Debo usar `inline` en funciones muy usadas?

cnVector cnVector::operator + (const cnVector& v) const { 
    return cnVector(
     x + v.x, 
     y + v.y, 
     z + v.z); 
} 

Mi pregunta es, porque esta función es muy corto, debo inline que a pesar de su uso intensivo? ¿O generaría demasiado código al usarlo que mucho?

+1

Marque funciones tan simples como en línea. Sin embargo, no importa mucho si le dices al compilador que alinee cualquiera que se vea bien. "Inline any suitable" en MSVC. No sé sobre GCC. –

+2

La transferencia de GCC ['-finline-functions'] (http://gcc.gnu.org/onlinedocs/gcc/Inline.html) le indicará que incorpore automáticamente las funciones que cree que deberían estar en línea. –

+2

Mi GCC (4.4.5) aplica '-finline-small-functions' como una optimización básica (es decir, bajo' -O'/'-O1' y superior). –

Respuesta

5

Recuérdese que la utilización en línea no es una garantía, sólo se da una pista para el compilador. Dudo mucho que en realidad aumente mucho el tamaño del ejecutable, la función es muy pequeña en sí misma.
Llamar a la función es casi del mismo tamaño que la función en sí.

2

El compilador es perfectamente capaz de tomar una decisión sobre si alinear una función o no dependiendo del perfil de optimización elegido.

Debe alinear una función si el compilador no lo hace, y la creación de perfiles con un conjunto de datos realista muestra que pasa una cantidad significativa de tiempo en la función, el algoritmo que utiliza dicha función es eficiente, y si está en línea muestra una mejora de velocidad en un punto de referencia con dicho conjunto de datos.

1

En caso de duda, compílelo con y sin línea y compare la velocidad y el tamaño de ejecución. El compilador por lo general ofrece un interruptor para el perfilado como mentionend arriba para ver lo que los costes de las llamadas de función, medidos en el tiempo,

3

Aplicar inline a todos funciones que se definen en el encabezado del alcance de espacio de nombres para evitar romper el One Definition Rule. Esto, por cierto, no tiene ninguna relación con la creación de líneas, a pesar del nombre de la palabra clave. (O ponerlos dentro de un espacio de nombres en el anonimato.)

inlinetambién da una pista para el compilador de línea llama a dicha función, pero a medida que los comentarios han señalado que el compilador es muy capaz de averiguar que salir por sí mismo de manera la palabra clave no es realmente necesaria para eso.