Imagine a project that has an interface class, such as:
struct Interface { virtual void f()=0; virtual void g()=0; virtual void h()=0; };
Suppose someone else wants to create a class that implements this interface, for which f , g , h all do the same.
struct S : Interface { virtual void f() {} virtual void g() {f();} virtual void h() {f();} };
Then it would be a proper optimization to create a vtable for S whose entries are all pointers to S::f , thereby preserving the call of the wrapper functions g and h .
However, printing the contents of vtable indicates that this optimization is not being performed:
S s; void **vtable = *(void***)(&s); for (int i = 0; i < 3; i++) std::cout << vtable[i] << '\n';
0x400940
0x400950
0x400970
Compiling with -O3 or -Os no effect, nor does switching between clang and gcc.
Why is this optimization feature missing?
At the moment, these are the assumptions that I have considered (and rejected):
- The vtable print code actually prints trash.
- Improving performance is considered futile.
- ABI forbids it.
source share