Re: same overhead in calling virtual and non virtual member function...?
ypjofficial@indiatimes.com wrote:
Hello All,
So far I have been reading that in case of a polymorphic class (
having at least one virtual function in it), the virtual function
call get resolved at run time and during that the vtable pointer is
made use of..
Yes.
eg.
class one
{
virtual void fun1(){ cout<<"one::fun1";} //This is a virtual
function.
void fun2(){ cout<<"one ::fun2";}//Not a virtual function.
};
int main()
{
one * o = new one;
o->fun1();
o->fun2();
delete o;
o= NULL;
return 0;
}
so when the virtual function gets called through the base class
poitner the call actually gets expanded to the code like this
o->vfptr[0]();
My confusion is how the call to the non virtual function (here fun2
)gets resolved in polymorphic class?
When does the compiler decide to look into the vtable and when not
to
look?
The compiler knows at compile time which functions are virtual, and
which are not. So it can generate vtable lookups only for those
functions that need it.
As in this scenario I strongly feel that, every time the compiler
has
to look into the vtable irrespective of the virtuality or non
virtuality of the function.If it finds the function entry in the
vtable then it calls the function from there otherwise if it doesn't
find any entry into the vtable it looks for the non virtual function
and then execute the fuction code?
No, the compiler decides which functions to put in the vtable, so it
already knows this at compile time.
So in other words whenever your class is polymorphic , we have to
deal
with this overhead always whether the class user calls the virtual
or
non virtual function...
No, not really.
A smart compiler can optimize you example even more. To be really
polymorphic, there has to be another class present, that inherits from
one and overrides fun1(). As there is not, all calls to fun1() must be
to the function in class one.
So the compiler can skip the vtable altogether, and always call fun1()
directly. That way the overhead will be the same for both functions!
:-)
Bo Persson
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]