The virtuality can have a double overhead :
- memory (because of vptr and vtable)
- runtime speed
Because of the memory overhead, I use some CRTP techniques to have a kind of static virtuality, when I need very high memory optimization.
But I wonder about the cost of virtuality for the runtime speed for non-virtual members :
#include <iostream>
class Base
{
public:
Base() {;}
virtual ~Base() {;}
public:
virtual void f1() {std::cout<<"f1 : Base"<<std::endl; /* FUNCTION BODY */}
void f2() {std::cout<<"f2 : Base"<<std::endl; /* FUNCTION BODY */}
void f3() {f1();}
};
class Derived : public Base
{
public:
Derived() {;}
virtual ~Derived() {;}
public:
virtual void f1() {std::cout<<"f1 : Derived"<<std::endl; /* FUNCTION BODY */}
};
And the main :
int main()
{
Base b;
Derived d;
Base* ptr = new Derived();
std::cout<<std::endl;
b.f1(); // 1a
b.f2(); // 1b
b.f3(); // 1c
std::cout<<std::endl;
d.f1(); // 2a
d.f2(); // 2b
d.f3(); // 2c
std::cout<<std::endl;
ptr->f1(); // 3a
ptr->f2(); // 3b
ptr->f3(); // 3c
std::cout<<std::endl;
return 0;
}
For each case : 1a, 1b ... 3c, where do I have a runtime overhead (increase of execution time) due to inheritance+virtuality compared to the case where Base and Derived are two completely independant classes with no inheritance ?
And particularly, is there any runtime overhead for the f2 function ?
Note : std::cout
is just an example. /* FUNCTION BODY */
can be 1k lines of code...