J'ai mis en place un petit test (peut-être très peu scientifique) pour déterminer le surdébit des fonctions virtuelles dans un héritage simple à un niveau et les résultats obtenus étaient, bien, exactement les mêmes class polymorphiquement ou lors de l'accès directement. Ce qui était un peu surprenant était l'ordre de grandeur du temps de calcul qui est introduit quand une fonction est déclarée virtuelle (voir les résultats ci-dessous).Test de surcharge des fonctions virtuelles
Y a-t-il tellement de surcharge lors de la déclaration des fonctions membres en tant que telles, et pourquoi est-elle toujours présente même lors de l'accès direct à la classe dérivée?
Le code est le suivant:
class base
{
public:
virtual ~base() {}
virtual uint func(uint i) = 0;
};
class derived : public base
{
public:
~derived() {}
uint func(uint i) { return i * 2; }
};
uint j = 0;
ulong k = 0;
double l = 0;
ushort numIters = 10;
base* mybase = new derived; // or derived* myderived = ...
for(ushort i = 0; i < numIters; i++)
{
clock_t start2, finish2;
start2 = clock();
for (uint j = 0; j < 100000000; ++j)
k += mybase->func(j);
finish2 = clock();
l += (double) (finish2 - start2);
std::cout << "Total duration: " << (double) (finish2 - start2) << " ms." << std::endl;
}
std::cout << "Making sure the loop is not optimized to nothing: " << k << std::endl;
std::cout << "Average duration: " << l/numIters << " ms." << std::endl;
Résultats:
base* mybase = new derived;
donne une moyenne de ~ 338 ms.
derived* myderived = new derived;
donne une moyenne de ~ 338 ms. L'élimination de l'héritage et la suppression des fonctions virtuelles donne une moyenne de ~ 38 ms.
C'est presque 10 fois moins! Donc, fondamentalement, si une fonction est déclarée virtuelle, la surcharge sera toujours identique, même si je ne l'utilise pas de façon polymorphique?
Merci.
Il semble que vous calculiez le coût de l'héritage + fonctions virtuelles ensemble. Vous devez tester l'instanciation d'une classe dérivée sans aucune fonction virtuelle, ainsi que la classe de base. –
Pourquoi utiliser 'new'? Il serait plus simple d'instancier l'objet sur la pile ... –
Cela ne ferait absolument aucune différence dans ce cas. Même surcharge en cas d'accès via un pointeur. –