2012-02-13 15 views
13

Durante una reciente revisión por pares, otro Software Engineer sugirió que declare que la función inline es inline en la definición (fuera de la clase) y en la declaración (dentro de la clase). Su argumento es que "Al marcarlo en línea, usted está diciendo que este método se ejecutará mucho más rápido que un método no en línea, y que los llamantes no tienen que preocuparse por llamadas excesivas al método."en línea en la definición y declaración

¿Es eso verdad? Si soy usuario de una clase, ¿realmente me preocupan las llamadas excesivas al método? ¿Hay algo de malo en listarlo como en línea tanto en la definición como en la declaración? El C++ FAQ estados:

Práctica recomendada: solo en la definición fuera del cuerpo de la clase.

¿Quién está aquí?

+6

Lo único que es * relevante * sobre 'inline' es que crea una exención de ODR. –

+0

Correcto de nuevo :) –

+4

"*" Al marcarlo en línea, usted está diciendo que este método se ejecutará mucho más rápido que un método no en línea, y que los llamantes no tienen que preocuparse por las llamadas excesivas al método. "* "Este tipo es __far__ de correcto". Scary ... – ildjarn

Respuesta

9

Eso suena como dos cosas totalmente sin relación. Poniendo inline en la declaración en la clase y la definición fuera de la clase no es necesaria. Ponerlo en una de las declaraciones es suficiente.

Si se habla de la adición de inline en un archivo .cpp donde se define una función allí, y que la función es miembro public, entonces usted debe no hacer eso. Las personas que llaman a las funciones inline deben tener sus definiciones visibles para ellos. El estándar C++ requiere eso.

+0

¿Su recomendación es poner la línea en el encabezado y no en el archivo Cpp si es público? En mi caso, es público. –

+0

@ 0A0D no, esa no es mi recomendación. Como indiqué, si llama a una función 'en línea', la definición de la función debe ser visible para el compilador (debe definirse en la unidad de traducción de la llamada). Póngalo en el encabezado, dentro o fuera de la definición de la clase, y luego puede marcarlo 'en línea' explícitamente (y si lo coloca fuera de la definición de clase en el encabezado, realmente tiene que hacerlo). Aunque es redundante poner 'inline' cuando defines la función dentro de la definición de la clase. –

+0

Solo he pensado en algo ... ¿no está en línea en el encabezado y en el archivo cpp redundante para el caso donde el código existe en el archivo cpp para la clase y no en el encabezado? Este es el quid de mi pregunta que todavía tengo dificultades –

8

Al marcarlo en línea, usted está diciendo que este método se ejecutará mucho más rápido que un método no en línea, y que los llamantes no tienen que preocuparse por las llamadas excesivas al método.

Eso es una tontería. Marcar una función inline no garantiza que la función en realidad esté físicamente en línea; incluso si lo es, no es garantía de que su función sea "más rápida".

Marcando la definición inline, así como la declaración, estás cosas confusas, haciéndose pasar por el usuario que no hay ninguna garantía de nada, que no hay ...

Si soy un usuario de una clase, ¿realmente me preocupan las llamadas excesivas al método?

Realmente no.

De hecho, en realidad, la única vez que usted debe escribir inline es cuando se necesita forzar línea almacenamiento por alguna razón (independientemente de si se produce la expansión en línea, usando la palabra clave siempre afecta a la aplicación de la regla de una definición de su función & hellip; aunque requerir esto es raro); de lo contrario, deje que el compilador decida qué funciones alinear y continúe. El corolario de esto es que no tiene que preocuparse por usar la palabra clave para pretender que está documentando algo.

+0

En este caso, solo estoy verificando si un valor en particular está establecido y es verdadero o falso. –

+2

@ 0A0D: su compilador lo sabe. Y si a los usuarios les preocupa que la función esté en línea por motivos de rendimiento, entonces están programando mal. :) –

+1

Esta respuesta me parece potencialmente confusa. "Marcar una función en línea no garantiza que la función esté realmente en línea", pero "la única vez que debe escribir en línea es cuando necesita forzar el almacenamiento en línea". Creo que debería explicar la diferencia entre "almacenamiento en línea" y "físicamente en línea", sin que la apariencia sea de una contradicción llana. –

Cuestiones relacionadas