Em C++, o construtor e o destruidor podem ser funções embutidas?
-
09-06-2019 - |
Pergunta
VC++ cria funções que são implementadas nas funções embutidas da declaração de classe.
Se eu declarar uma classe Foo
como segue, então as funções CONSTRUCTOR e DESTRUCTOR são inline?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
Solução
Definir o corpo do construtor DENTRO da classe tem o mesmo efeito de colocar a função FORA da classe com a palavra-chave "inline".
Em ambos os casos, é uma dica para o compilador.Uma função "inline" não significa necessariamente que a função será inline.Isso depende da complexidade da função e de outras regras.
Outras dicas
A resposta curta é sim.Qualquer função pode ser declarada inline, e colocar o corpo da função na definição da classe é uma maneira de fazer isso.Você também poderia ter feito:
class Foo
{
int* p;
public:
Foo();
~Foo();
};
inline Foo::Foo()
{
p = new char[0x00100000];
}
inline Foo::~Foo()
{
delete [] p;
}
No entanto, cabe ao compilador se ele realmente insere a função.O VC++ praticamente ignora seus pedidos de inlining.Ele só irá incorporar uma função se achar que é uma boa ideia.Versões recentes do compilador também incorporarão coisas que estão em arquivos .obj separados e não declaradas inline (por exemplo,do código em diferentes arquivos .cpp) se você usar geração de código de tempo de link.
Você poderia usar o __forceinline palavra-chave para dizer ao compilador que você realmente quer dizer isso quando diz "inline this function", mas geralmente não vale a pena.Em muitos casos, o compilador realmente sabe o que é melhor.
Colocar a definição da função no corpo da classe é equivalente a marcar uma função com a palavra-chave inline.Isso significa que a função pode ou não ser incorporada pelo compilador.Então acho que a melhor resposta seria "talvez"?
Na mesma medida em que podemos tornar qualquer outra função inline, sim.
Inline ou não é decidido principalmente pelo seu compilador.Inline no código apenas dá dicas para o compilador.
Uma regra com a qual você pode contar é que as funções virtuais nunca serão incorporadas.Se sua classe base tiver um construtor/destruidor virtual, o seu provavelmente nunca será embutido.