摘录侯杰《深度探索C++对象模型》 第一章---关于对象 P13
1. 虚表
函数定义
X foobar()
{
X xx;
X* px = new X;
//foo() 是一个virtual function
xx.foo();
px->foo();
delete px;
delete xx;
}
这个函数在内部的转化为虚拟C++代码:
void foobar(X& _result)
{
//构造_result
//用来取代 local xx
_result.X::X();
//扩展X* px = new X;
px = _new (sizeof(x));
if(px != 0)
px->X::X();
//扩展xx.foo, 但不使用virtual 机制
//以_result取代xx
foo(&result);
//使用virtual 机制扩展px->foo()
(*px->vtbl[2]) (px);
//扩展delete px;
if( px!=0)
{
(*px->vtbl[1]) (px); // destructor
_delete(px);
}
//无须使用 name return statement
// 无须摧毁 local object xx
return;
}
这个例子,充分的说明了虚表(virtual Table)的使用。 每个class object都有一个虚表指针。 虚表的不同行对应了虚函数,析构函数。
2. 需要多少内存才表表现一个class object
a) 其nonstatic data member
b) 加上任何由于alignment的需求,而补齐的空间(字节对齐)。 32位机,通常alignment为4bytes
c) 加上为了支持virtual而内部产生的任何额外负担(overhead)