I’ve already read Are inline virtual functions really a non-sense?. But I still have some doubts and found no answer there.
They say that if situation isn’t ambiguous, compiler should inline the virtual function.
However:
This can happen only when the compiler has an actual object rather than a pointer or reference to an object.
So what if I have a B class derived from an A one (which contains a virtual void doSth() function) and I use the B* pointer, not the A*:
B* b = new B;
b->doSth();
- Suppose that the
Bhasn’t any child classes. It’s rather obvious (on the compile time) what function should be called. So it’s possible to be inlined. Is it in fact? - Suppose that the
Bhas some child classes but these classes haven’t its owndoSth()function. So compiler should “know” that the only function to call isB::doSth(). I guess it doesn’t inline though?
It doesn’t matter whether
Bhas any derived classes. In that situationbpoints to aBobject so the compiler can inline the call.And surely any decent modern compiler can and will do that in your situation. If you don’t use pointers it becomes a whole lot easier. It’s not really an “optimization” then. The fact that you can omit a virtual call then becomes obvious by only looking at the AST node at the left side of the
.-operator. But if you use pointers, you need to track the dynamic type of the pointee. But modern compilers are capable of that.EDIT: Some experiment is in order.
As can be seen, clang does direct calls to
f, both whenapoints to aAand when it points to aB. GCC does that too.