The simple existence of a table of virtual functions depends on the compiler (but all compilers do), and the location does not have to ... In all compilers I know about, vptr is stored at the beginning of the object. The reason is that it provides a uniform location. Consider the class hierarchy:
struct base {
T data;
virtual void f();
};
struct derived : base {
T1 data;
virtual void g();
};
vptr , sizeof(T) base. , derived, base base, vptr sizeof(T) , - derived (sizeof(T) , sizeof(T1) ). , .
, this, vtable, vptr, , . vptr , this vptr.