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);
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top