Plantilla de C++ y en línea


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

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?
};

También, cómo se aplica la regla inline a las funciones de plantilla no anidadas, como

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

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

¿Qué pasaría aquí en el primer y en el segundo caso?

Gracias.

Author: smerlin, 2010-09-12

3 answers

Las funciones templadas que yo sepa están automáticamente en línea. Sin embargo, la realidad es que la mayoría de los compiladores modernos ignoran regularmente el calificador en línea. Lo más probable es que la heurística optimizadora del compilador haga un trabajo mucho mejor de elegir qué funciones integrar que un programador humano.

 2
Author: Puppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-12 13:00:19

Ya que cuando instancias obtienes una clase, esa función es como una función miembro ordinaria. Se define en esa clase, por lo que la función está automáticamente en línea.

Pero no importa mucho aquí. Puede definir plantillas de función o miembros de plantillas de clase varias veces en un programa de todos modos-no necesita inline para decirle al compilador sobre eso como en el caso no-plantilla.

 13
Author: Johannes Schaub - litb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-07 09:33:13

La palabra clave inline no es una "regla". Es simplemente una sugerencia/sugerencia para el compilador y lo que haga con él depende completamente de él y de su implementación. Con esto en mente, no es posible saber qué sucederá con tus ejemplos. De hecho, el compilador puede insertar todos, algunos o ninguno de ellos.

 1
Author: RC.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-12 12:59:34