Pregunta

VC++ crea funciones que se implementan dentro de las funciones en línea de declaración de clase.

Si declaro una clase Foo de la siguiente manera, ¿las funciones CONSTRUCTOR y DESTRUCTOR están en línea?

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}
¿Fue útil?

Solución

Definir el cuerpo del constructor DENTRO de la clase tiene el mismo efecto que colocar la función FUERA de la clase con la palabra clave "inline".

En ambos casos es una pista para el compilador.Una función "en línea" no significa necesariamente que la función estará integrada.Eso depende de la complejidad de la función y otras reglas.

Otros consejos

La respuesta corta es sí.Cualquier función se puede declarar en línea y poner el cuerpo de la función en la definición de clase es una forma de hacerlo.También podrías haber hecho:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

Sin embargo, depende del compilador si realmente integra la función.VC++ prácticamente ignora sus solicitudes de inserción.Sólo incorporará una función si cree que es una buena idea.Las versiones recientes del compilador también incorporarán elementos que se encuentran en archivos .obj separados y no declarados en línea (p. ej.del código en diferentes archivos .cpp) si usa generación de código de tiempo de enlace.

Podrías usar el __forceinline palabra clave para decirle al compilador que realmente lo dice en serio cuando dice "incorporar esta función", pero generalmente no vale la pena.En muchos casos, el compilador realmente sabe más.

Poner la definición de la función en el cuerpo de la clase equivale a marcar una función con la palabra clave en línea.Eso significa que la función puede o no estar incorporada por el compilador.Entonces supongo que la mejor respuesta sería "tal vez".

En la misma medida que podemos hacer cualquier otra función en línea, sí.

Su compilador decide principalmente si está en línea o no.En línea en el código solo se dan sugerencias para el compilador.
Una regla con la que puede contar es que las funciones virtuales nunca estarán integradas.Si su clase base tiene un constructor/destructor virtual, el suyo probablemente nunca estará integrado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top