Domanda

VC++ crea funzioni implementate all'interno delle funzioni inline della dichiarazione di classe.

Se dichiaro una class Foo come segue, allora le funzioni inline CONSTRUCTOR e DESTRUCTOR sono?

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

{
    Foo f;
    (f);
}
È stato utile?

Soluzione

Definire il corpo del costruttore ALL'INTERNO della classe ha lo stesso effetto di posizionare la funzione FUORI dalla classe con la parola chiave "inline".

In entrambi i casi è un suggerimento per il compilatore.Una funzione "inline" non significa necessariamente che la funzione sarà inline.Ciò dipende dalla complessità della funzione e da altre regole.

Altri suggerimenti

La risposta breve è sì.Qualsiasi funzione può essere dichiarata in linea e inserire il corpo della funzione nella definizione della classe è un modo per farlo.Avresti potuto anche fare:

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

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

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

Tuttavia, spetta al compilatore se effettivamente esegue l'inline della funzione.VC++ ignora praticamente le tue richieste di incorporamento.Inlineerà una funzione solo se ritiene che sia una buona idea.Le versioni recenti del compilatore inlineeranno anche elementi che si trovano in file .obj separati e non dichiarati inline (ad es.dal codice in diversi file .cpp) se usi generazione del timecode del collegamento.

Potresti usare il __forzain linea parola chiave per dire al compilatore che lo intendi davvero quando dici "inline questa funzione", ma di solito non ne vale la pena.In molti casi, il compilatore lo sa davvero meglio.

Inserire la definizione della funzione nel corpo della classe equivale a contrassegnare una funzione con la parola chiave inline.Ciò significa che la funzione può o meno essere incorporata dal compilatore.Quindi immagino che la risposta migliore sarebbe "forse"?

Nella stessa misura in cui possiamo rendere qualsiasi altra funzione in linea, sì.

Inline o meno è deciso principalmente dal compilatore.Inline nel codice suggerisce solo al compilatore.
Una regola su cui puoi contare è che le funzioni virtuali non saranno mai in linea.Se la tua classe base ha un costruttore/distruttore virtuale, la tua probabilmente non verrà mai incorporata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top