2010-09-12 11 views
34

Cuando estoy escribiendo una clase simple (sin plantilla), si la implementación de la función se proporciona "en su lugar", se trata automáticamente como inline.plantilla de C++ y en línea

class A { 
    void InlinedFunction() { int a = 0; } 
    // ^^^^ the same as 'inline void InlinedFunction' 
} 

¿Qué pasa con esta regla cuando se habla de clases basadas en plantillas?

template <typename T> class B { 
    void DontKnowFunction() { T a = 0; } 
    // Will this function be treated as inline when the compiler 
    // instantiates the template? 
}; 

Además, ¿cómo es la regla inline aplicado a funciones de plantilla no anidados, como

template <typename T> void B::DontKnowFunction() { T a = 0; } 

template <typename T> inline void B::DontKnowFunction() { T a = 0; } 

lo que ocurriría en el primer y en el segundo caso aquí?

Gracias.

+0

¿Puedo preguntar por qué quieres saber la respuesta a esta pregunta? He hecho bastantes C++ codificaciones, y no he enfrentado circunstancias en las que haya importado mucho. –

+18

@ Benoît Lo mismo aquí, pero al escribir recientemente un fragmento de código basado en plantillas, comprendí que en realidad no sé qué sucede en el caso que he descrito. Entonces, ¿por qué no hacer una pregunta? :) –

+0

No estoy seguro de lo que está buscando para la pregunta de la clase, pero estoy interesado en la respuesta: o) No creo que haya nada especial en DontKnowFunction() y en línea. Si el cuerpo es parte de la declaración de clase, entonces se considera implícito, de lo contrario, se usará en línea y el cuerpo estará fuera de la declaración. – skimobear

Respuesta

3

Las funciones programadas hasta donde yo sé están automáticamente en línea. Sin embargo, la realidad es que la mayoría de los compiladores modernos regularmente ignoran el calificador en línea. Es muy probable que la heurística optimizadora del compilador haga un mejor trabajo al elegir qué funciones incluir en línea que un programador humano.

+15

compiladores están permitidos _No_ ignorar el ' calificador en línea y no conozco ningún compilador moderno que lo haga. 'inline' realiza cambios específicos bien definidos en las reglas del lenguaje para múltiples definiciones de funciones. No es solo una pista. –

+20

en línea es un significado muy específico y definido. Pero tiene muy poco que ver con "Code in-lining" y la mayoría de los compiladores modernos lo ignoran con respecto a la "pista" que da para "code in-lining". No se pueden ignorar los términos de vinculación y otras cosas. –

+6

Charles, los compiladores pueden ignorar los calificadores en línea. http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.1 – maayank

1

La palabra clave en línea no es una "regla". Es simplemente una sugerencia/sugerencia para el compilador y lo que hace con él depende completamente de ello y de su implementación. Con esto en mente, no es posible saber qué sucederá con sus ejemplos. El compilador puede de hecho alinear todos, algunos o ninguno de ellos.

+0

Sé que la palabra clave 'inline' actúa como una recomendación, pero en el primer ejemplo (cuando se escribe el código directamente dentro de la definición de la clase) el' inline' se "anexa automáticamente", por lo que significa que al menos doy esta recomendación al compilador Pero no sé qué sucedería en los casos basados ​​en plantillas. Estoy bastante seguro de que hay algunas reglas para eso ... –

+0

Correcto, pero ya sea que el en línea esté allí o no explícita o implícitamente, el compilador puede hacer con él lo que no podrá predeterminar el comportamiento del compilador. –

+0

Eso no es correcto @RC. - "No se requiere una implementación para realizar esta sustitución en línea [del cuerpo de la función] 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. " [borrador de trabajo 7.1.2/2] – boycy

13

Dado que cuando crea una instancia, obtiene una clase, esa función es como una función de miembro ordinario. Se define en esa clase, por lo que la función está automáticamente en línea.

Pero realmente no importa mucho aquí. Puede definir plantillas de funciones o miembros de plantillas de clase varias veces en un programa de todos modos; no necesita inline para contarle al compilador acerca de eso como en el caso sin plantilla.

+0

"ha * * declaró en esa clase," debe ser cambiado a * * Definido, no? –

+1

@JohanLundberg sí, yo creo que es lo que quería decir. Lo cambié, gracias. –

+0

¿Qué pasaría si el en línea es un calificador para una plantilla de función, que no es miembro de una clase? ¿Está implicado en línea de esta manera también? –