当前位置: 首页 > news >正文

c++-对象模型

1.C++对象模型
nonstatic data members被配置于每一个class object内.
static data members被存储在class object外.
staticnonstatic function members实现代码也存储在class object外.
virtual functions:
a. 每个class产生一堆指向virtual functions指针,放在表格中.表中每个条目指向该类型的一个虚函数代码实例的起始地址.
b. 每个class object被安插一个指针,执行相关的virtual tablevptr的设定,重置由每一个classconstructor/destructor/copy assignment自动完成.每一个class所关联的type_info object也放在表格中.
c. 一个class object所需内存构成,一般要有:
c.1. 其nonstatic data members的总和大小
c.2. 加上由alignment的需求而填补上去的空间
c.3. 加上为支持virtual而产生的负担

2.注意点
对一个包含虚表指针的类对象执行memset(&obj, 0, sizeof(obj))存在把保存在类对象内的虚表指针设为0的风险.

3.虚拟继承下的类型尺寸

class X{};class V1{inti2;virtualvoidfun(){}};class V2:public virtual V1{inti;virtualvoidfun2(){}};class V3:public V2,public virtual V1{public:inti;virtualvoidfun3(){}};

类型尺寸:
a.sizeof(X)1
b.sizeof(V1)16
c.sizeof(V2)32
d.sizeof(V3)32
C++中,当使用虚继承时,类的内存布局会发生变化,主要是为了处理多重继承时的公共基类子对象问题。虚继承通过在继承体系中引入一个共享的、指向公共基类子对象的指针(通常称为虚基类指针或vptr),来确保只有一个公共基类的实例存在于派生类中。
针对上述:
(1).class X {}:X是一个空类,但即使如此,编译器通常也会为它分配至少一个字节的内存,以区分不同的对象。这是为了确保两个不同类型的空对象在内存中占据不同的地址。若空类作为基类时,其尺寸计算为0.因为此时派生类非空类时,类型实例至少有1个字节内存.无需上述处理.派生类也是空类时,派生类实例整体占1字节即可.
(2). 虚拟继承
上述虚拟继承下V1,V2,V3实例对象可能的内存布局:

上述是V1

上述是V2

上述是V3

4.C++如何实现多态
对含虚函数的class有且仅有一个virtual table,每个table内含其对应之class object中所有active virtual functions函数实例的地址.
active virtual functions包括:
(1).class自身新定义或重载的虚函数.
(2). 继承自base class的虚函数.

一个实际例子

class point{public:virtual~point(){}virtualvoidmult()=0;virtualvoidy()[}virtualvoidz(){}private:intx;};

x实例对象内存可能的布局示意图:

指向的虚表可能的构成示意:

class point2d:public point{public:virtual~point2d(){}virtualvoidy(){}virtualvoidmult(){}public:inty;};

一个point2d实例可能的内存布局示意:

point2d可能的虚表构成:

在上述背景下,通过基类point指针ptry()时:
(1). 依据实例对象起始地址,容易定位到对象内虚表指针.
(2). 通过函数名易于定位到需表中表项位置.
这样就完成了多态调用.

5.多重继承下多态的一个可能实现说明

struct Base1{ public: int a; virtual ~Base1(){} virtual SpeakClearly(){} };

struct Base2{ public: int b; virtual ~Base2(){} virtual void mumble(){} virtual void clone(){} };

内存布局略.

struct Derived : public Base1, public Base2{ public: int c; virtual ~Derived(){} virtual void clone(){} };


这里一个Derived实例对象将含两个虚表指针.(单独继承下只有一个).且每个Base1部分的虚表指针,Base2部分的虚表指针所指向的虚表.由基类虚函数,派生类重载综合得到.

todo

1.补充说明public,public virtual区别
2.补充说明public,public virtual下包含虚表时多重继承下内存布局。

http://www.jsqmd.com/news/1321849/

相关文章:

  • 2026 年至今,牡丹知名的匹布硅胶印花加工源头厂家哪家强,做印花的都在找它?居然能让匹布印花的质感和效率翻番!-德龙匹布印花 - 领域鉴赏官
  • BepInEx 6.0.0在Unity游戏中的稳定性问题深度解析与解决方案
  • 时序图实战指南:从核心原理到微服务交互设计
  • Unity游戏实时本地化实战:XUnity.AutoTranslator动态翻译方案详解
  • 游戏引擎与Heroic平台自动化集成:5个提升开发效率的实用技巧
  • Selenium无头浏览器自动化Web微信:配置、实战与工程化指南
  • 从思维到实战:系统化Debug方法论与多场景调试指南
  • 2026年UV能量计厂家综合实力排行榜TOP5:精密检测选型全维度解析
  • 2026淮安管道疏通哪家好旭日靠谱上门疏通避坑指南 - 余生黄金回收
  • 幻兽帕鲁存档解析终极指南:从二进制黑盒到可编辑JSON的完整教程
  • 2026潮汕地接挑选之道 为何普宁市稻人旅行社稳居本地服务第一梯队 - 互联网科技品牌测评
  • WarcraftHelper终极指南:让经典魔兽3在现代电脑上完美运行
  • MagicDraw序列图深度解析:从动态建模到设计验证
  • 房地产公司领导安排任务员工总做偏?北京华恒智信成功案例
  • Unity透明材质深度写入与Alpha混合渲染问题解析
  • 适合金融科技团队的敏捷研发管理平台怎么选?合规与敏捷兼顾的方案
  • 315MHz无线钥匙扣拆解:射频通信原理、硬件设计与DIY优化指南
  • 软件测试全流程深度解析:从V模型到自动化实战
  • [前端优化]使用Combres合并对js、css文件的请求
  • 游戏建模无门槛系统化教学,湖南梵映教育科技有限公司线上建模让普通人轻松入行 - 资讯报道
  • 从秋招0 Offer到拿下3个大厂测试岗:一个应届生的逆袭复盘
  • 手表佩戴与信号准确性:解密PPG测量背后的关键因素
  • (2026年8月更新)临汾甲醛检测公司怎么选:只做检测、不做治理的专业 CMA 资质实验室——醛清测研甲醛检测中心室内空气及环境检测 - 创达咨询
  • 3A企业认证找哪家机构安全?2026年在线申请攻略 - 跑政通
  • Go 模板初识
  • 告别手动签到烦恼!青龙面板签到盒让30+平台自动打卡
  • 北京产业园代办哪家正规:【博亚信诚】专业规范 - 18002239949
  • D2DX技术解密:让暗黑破坏神2在现代PC上重获新生的魔法引擎
  • OS 感知多分支 AiTM 钓鱼套件攻击机理与全域防御体系研究
  • 金融/零售/制造三大行业AI分析落地实录(含脱敏代码库+评估指标集),仅开放48小时下载权限