C++ 中的对象布局
2024-10-16 13:57:41
C++中的涉及到虚表时,类对象的布局分为:虚表与数据成员,子类包含派生类布局,假设下面一个程序:
#include <iostream> using namespace std; class B {
private:
int a;
public:
B() {
a = ;
} virtual void fun() {
cout << "B::fun" << endl;
}
}; class A:public B {
public:
A() {
cout << "class A constructor" << endl;
m = ;
n = ;
} ~A() {
cout << "~A()" << endl;
}
virtual void fun() {
cout << "A::fun" << endl;
} private:
int m,n;
}; int main(int argc, char *argv[])
{
A a;
int *p;
int **pvtr = (int **)&a; typedef void (*pf_t)(); pf_t pf;
p = static_cast<int *>((int *)&a); pf = (pf_t)(pvtr[][]);
pf();
//cout << "*pf:" << *pf << ",pf:" << pf << endl; //(*(*pf+sizeof(void*) * 2))(); cout << "p:" << *p << endl;
p ++ ;
cout << "p:" << *p << endl;
p++;
cout << "p:" << *p << endl;
p++;
cout << "p:" << *p << endl; p++;
cout << "p:" << *p << endl; return ;
}
通过VS 2010显示对象布局图(cl -d1reportAllClassLayout),其中meta为对应对象的类型信息:
类B:
class B size():
+---
| {vfptr}
| a
+--- B::$vftable@:
| &B_meta
|
| &B::fun
类A:
class A size():
+---
| +--- (base class B)
| | {vfptr}
| | a
| +---
| m
| n
+--- A::$vftable@:
| &A_meta
|
| &A::fun A::fun this adjustor:
最新文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(38)-Easyui-accordion+tree漂亮的菜单导航
- 我的EF功能
- InventSumDelta表的作用
- 对抗静态分析——so文件的加密
- 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
- Jmeter java.lang.OutOfMemoryError: GC overhead limit exceeded
- Android 中使用自定义字体的方法
- 35、Android 性能优化、内存优化
- chgrp、chown、chmod命令
- (转)Android中截取当前屏幕图片
- 用SQL实现统计报表中的";小计";与";合计";的方法详解
- LightOJ DNA Prefix(字典树+dfs)
- XML 处理利器 : XStream
- 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合
- python 支付宝SDK
- 第1章 Linux文件类基础命令
- nodemailer + express + h5 拖拽文件上传 实现发送邮件
- 关于MySQL慢日志,你想知道的都在这
- WindowsErrorCode
- 测试 多线程 实现 callable 带返回值