Ho questa domanda quando ho ricevuto un commento di revisione del codice che dice che le funzioni virtuali non devono essere in linea.Le funzioni virtuali in linea sono davvero un non senso?
Ho pensato che le funzioni virtuali incorporate potrebbero rivelarsi utili in scenari in cui le funzioni vengono richiamate direttamente sugli oggetti. Ma la contro-argomentazione mi è venuta in mente: perché si vorrebbe definire virtuale e quindi usare gli oggetti per chiamare i metodi?
È meglio non utilizzare funzioni virtuali in linea, poiché non vengono quasi mai espanse?
Snippet di codice che ho usato per l'analisi:
class Temp
{
public:
virtual ~Temp()
{
}
virtual void myVirtualFunction() const
{
cout<<"Temp::myVirtualFunction"<<endl;
}
};
class TempDerived : public Temp
{
public:
void myVirtualFunction() const
{
cout<<"TempDerived::myVirtualFunction"<<endl;
}
};
int main(void)
{
TempDerived aDerivedObj;
//Compiler thinks it's safe to expand the virtual functions
aDerivedObj.myVirtualFunction();
//type of object Temp points to is always known;
//does compiler still expand virtual functions?
//I doubt compiler would be this much intelligent!
Temp* pTemp = &aDerivedObj;
pTemp->myVirtualFunction();
return 0;
}
consideri la compilazione di un esempio con qualunque switch sia necessario per ottenere un elenco assemblatore e quindi mostrare il revisore del codice che, in effetti, il compilatore può integrare funzioni virtuali. –
Di solito, questo non sarà in linea, perché si sta chiamando la funzione virtuale in base alla classe base. Sebbene dipenda solo da quanto intelligente sia il compilatore. Se fosse in grado di indicare che 'pTemp-> myVirtualFunction()' potrebbe essere risolto come chiamata non virtuale, potrebbe avere quella chiamata in linea. Questa chiamata referenziata è integrata da g ++ 3.4.2: 'TempDerived & pTemp = aDerivedObj; pTemp.myVirtualFunction(); 'Il tuo codice non lo è. – doc
Una cosa che gcc fa effettivamente è confrontare la voce vtable con un simbolo specifico e quindi utilizzare una variante inline in un ciclo se corrisponde. Ciò è particolarmente utile se la funzione inline è vuota e il loop può essere eliminato in questo caso. –