2008-08-21 6 views
58

VC++ realiza funciones que se implementan dentro de la declaración de clase de funciones en línea.En C++ ¿el constructor y el destructor pueden ser funciones en línea?

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

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

{ 
    Foo f; 
    (f); 
} 

Respuesta

57

Definir el cuerpo del constructor dentro de la clase tiene el mismo efecto de colocar la función fuera de la clase con la palabra clave "en línea".

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

+20

Es más que una pista: en línea le permite definir la misma función en más de una unidad de traducción. Este es un requisito previo para incluir la función en un sitio de llamada (sin optimización de tiempo de enlace), que es donde la palabra clave recibe su nombre. –

+3

@FredNurk Estoy totalmente de acuerdo contigo - Sin embargo, el propio Stroustrup (El diseño y la evolución de C++) se refiere a 'inline' como una 'pista' para el compilador –

+0

Como se señaló anteriormente, esta respuesta no está actualizada. [Aquí] (https://stackoverflow.com/a/44247740/509868) es una respuesta más actualizada a una pregunta similar. – anatolyg

2

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

25

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

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

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

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

Sin embargo, es hasta el compilador si lo que realmente hace la función inline. VC++ prácticamente ignora sus solicitudes de alineación. Solo alineará una función si cree que es una buena idea. Las versiones recientes del compilador también incluirán elementos que están en archivos .obj separados y no declarados en línea (por ejemplo, del código en diferentes archivos .cpp) si usa link time code generation.

Puede usar la palabra clave __forceinline para decirle al compilador que realmente lo dice en serio cuando dice "en línea esta función", pero usualmente no vale la pena. En muchos casos, el compilador realmente sabe mejor.

1

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

1

En línea o no es principalmente decidido por su compilador. Inline en el código solo insinúa al compilador.
Una regla con la que puede contar es que las funciones virtuales nunca estarán en línea. Si su clase base tiene un constructor/destructor virtual, el suyo probablemente nunca estará en línea.

+0

btw, las funciones de miembros virtuales (incluidos los destructores virtuales) pueden estar inline si el compilador conoce el tipo (completo) del objeto que se está destruyendo. –

Cuestiones relacionadas