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)
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)
相关文章推荐
- 在cmd命令行下使用cl编译运行C/C++源文件
- C++ 什么时候只能用intialization list而不能用assignment
- 简述C语言中system()函数与vfork()函数的使用方法
- 【C++】双向链表
- C++类的空间大小
- C语言中设置进程优先顺序的方法
- 对C++名字隐藏的理解
- C++:在迭代中删除map的成员
- 【C++】声明并实现一个万年历类【腾讯面试题】
- 必须返回对象时,别妄想返回引用(Effective C++_21)
- C++类的内存分配
- 回调函数(C语言)
- C++类内存分布
- C语言 malloc/free和C++中new/delete的区别
- 详解C语言sscanf()函数、vsscanf()函数、vscanf()函数
- OCV与CPPR模式的理解
- 判断一个字符串是否是合法IP地址
- C++中new和delete比 malloc和free有哪些优点?
- C++学习 函数模板及重载
- 开了一个新的C语言班级