Ecco il mio problema. Ho una classe base e una classe derivata che sovrascrive alcuni metodi dalla classe base. Per semplicità si consideri il seguente esempio:Si può evitare un sovraccarico vtable usando un static_cast?
struct base
{
virtual void fn()
{/*base definition here*/}
};
struct derived : base
{
void fn()
{/*derived definition here*/}
};
Nel mio programma vero e proprio, queste classi sono passate come argomenti di altre classi e sono chiamati in altri metodi, ma per ragioni di semplicità creiamo una semplice funzione che prende come argomento o la classe base o derivata. Posso semplicemente scrivere
void call_fn(base& obj)
{obj.fn();}
e la chiamata alla funzione appropriata sarà risolto a run-time a causa delle funzioni virtuali.
Sono preoccupato, tuttavia, che se il call_fn
, deve essere chiamato milioni di volte (che nel mio caso sarà come la mia applicazione reale è un esperimento di simulazione), otterrò un overhead significativo che vorrei evitare .
Quindi, mi chiedevo se l'utilizzo di un static_cast potrebbe effettivamente affrontare il problema. Forse qualcosa di simile:
template <typename T>
void call_fn(base& obj)
{(static_cast<T*>(&obj))->fn();}
In questo caso, la chiamata di funzione sarebbe fatto come call_fn<base>(obj)
per chiamare il metodo base o call_fn<derived>(obj)
per chiamare il metodo derivato.
Questa soluzione eviterà l'overhead vtable o sarà comunque interessata? Grazie in anticipo per eventuali risposte!
A proposito, sono a conoscenza del CRTP ma non lo conosco molto bene. Questo è il motivo per cui vorrei conoscere prima la risposta a questa semplice domanda :)
Qual è la definizione di * overhead significativo *? Potresti essere sorpreso di ciò che l'overhead di chiamare una funzione virtuale è qualche milione di volte. –
Hai effettivamente dimostrato che l'overhead vtable è un problema con il tuo codice? E se è così, puoi dimostrare che facendo il relativo "se (è questa classe) fai questo altrimenti" è più veloce? Sospetto che non lo sia, a meno che non faccia in modo che il compilatore sia in linea con la funzione e questo fa risparmiare un sacco di sforzi. –
Non l'ho provato ... è per questo che ho voluto creare un metodo che eviti il vtable, in modo da poter confrontare i due e avere un'idea più chiara di quanto sia significativo il sovraccarico :) – linuxfever