您的位置:首页 > 编程语言 > C语言/C++

C++对象模型读书笔记-- 虚表 virtual table

2015-08-31 16:44 441 查看
摘录侯杰《深度探索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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: