《深度探索c++对象模型》 学习笔记 - 3 data语义学

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 

1.         类对象大小受三方面的影响:1virtual basevirtual func带来的负担;2)是否EBO3alignmentsizeof大全)。

2.         virtual base class表示“只有一个单一而被共享的实体”,而无论出现在继承体系中多少次。

3.         c++并不强制“base class subobject的内存排列次序”和“不同存取级别的类中的数据成员”的排列次序。

4.         static数据成员会放到global data segment中,并不会影响到单独某一个object的大小。

5.         数据成员类型的绑定、成员函数指针请参看代码部分。关于成员函数指针,要对对象的sizeof非常了解才能懂。

6.         X的对象x和指针pt存取成员变量m,何时会有什么重大差别?当m是从Xvirtual基类派生而来时。

7.         内存中,基类出现在子类前面,但virtual基类会在整个布局的最后面;如果有多个virtual基类,以声明序排列。

8.         继承对类的数据成员的影响(详细请看系列的附录部分):

a)    简单无多态的继承。不会增加内存空间以及存取上的额外负担。C++语言保证:出现在子类中的基类子对象(base class subobject)要保持其原样完整性”,即:任何时间取出“基类子对象”都是一个完整的整体。要注意对齐问题。

b)    加上多态(有虚函数)

Ø 开销:1vtbl(含typeid);2)加入vptr;改造3)构造函数和4)析构函数,以处理vptrVCvptr放到对象的最前面(如果有virtual base class的话,vptr会在offset指针之后),即使基类没有virtual函数而只有子类有。

 

Ø 子类与第一个父共享同一个vptr,有第二基类会增加vptr。子类增加新或修改virtual函数会更新对应vtbl的内容。

c)    多重继承:其问题主要出现在派生类对象与其第二或后面的基类对象之间的转换,因为这样会涉及到指针的offset

d)    虚拟继承即类含有Nvirtual基类

Ø 代表着它可以被切割为两部分:不变部分(放前面)和共享部分(放后面)。

Ø 不变部分中的数据,不论后继如何变化,其offset总是固定的;而共享部分,表示的是virtual基类的子对象,它的offset会因为派生层次的增加(无论在最底层还是最高层增加)而有变化,因为它总是在整个类对象的最后面。

Ø 派生类中会安排指向virtual基类的offset指针,与访问virtual基类成员,需要首先进行offset进行偏移定位。

9.         关于对齐对sizeof的影响,只有:1)所有的“基类子对象”全是char;或2virtual base全是char;这两种情况才可能出现奇数size1923等),其他情况肯定都是被对齐到int*(比如vptr)、double等的长度。

 

 

一些实验代码:

  

 

C/C++变量做结构体数组长度 先看一下:C/C++变量做数组长度 用MFC做抓猴子的小游戏,用同样的方法在头文件中定义结构体数组报错。 protected: // create from serialization only CCatchMonkeyView(); DECLARE_DYNCREATE(CCatchMonkeyView) // Attributes public: CCatchMonkeyDoc* GetDocument(); int sum; //猴子总数 int remain; //剩余猴子数 int h 阅读详情

相关推荐

IOS 警告 汇总

Semantic Warnings Warning Message -WCFString-literal input conversion stopped due to an input byte that does not belong to the input codeset UTF-8 -WNSObject-attribute

孙启超 5万+

深度探索C++对象模型学习笔记Data语义学(The Semantics of Data

深度探索C++对象模型学习笔记Data语义学(The Semantics of Data)一、数据成员的绑定1、全局变量与局部变量2、全局类型与局部类型二、Data Member 的存取1、静态成员变量2、非静态数据成员 一、数据成员的绑定 1、全局变量与局部变量 float x = 5.0; class CLS_Point { public: CLS_Point(float _x) { x = _x; } float getX() { return x; } privat

coding-hwz 249

深度探索C++对象模型学习笔记

深度探索C++对象模型学习笔记 最近学习了c++对象模型,做下笔记,方便日后查阅 第一章:关于对象 c++对象模型 在此模型中,成员变量被配置在每一个对象中,静态成员变量、成员函数和静态成员函数放置在对象之外,虚函数则以下两个步骤支持: 每个类产生一堆指向虚函数的指针放在表格之中,这个表格叫做虚函数表(vtal) 每个对象中被添加一个指针(vptr),指向相关的虚函数表,vptr的赋值和重置由每个类的构造函数、析构函数和拷贝赋值运算符自动完成。每个类所关联的type_info放在虚函数表的表头

QT练手小程序 459

深度探索C++对象模型——Data语意学

深度探索C++对象模型——Data语意学 一个空class与继承的相关讨论 class X {}; //sizeof(X)的大小为1 class Y: public virtual X {};//sizeof(Y)的大小为8 class Z: public virtual X {};//sizeof(Z)的大小为8 class A: public Y,public Z {};//sizeof...

并不知道叫什么好 383

探索C++的魅力:Data-Structures-and-Algorithms-in-cpp项目深度解析

探索C++的魅力:Data-Structures-and-Algorithms-in-cpp项目深度解析 在算法的世界里,C++一向以其高效和灵活著称。今天,我们要向您推荐的开源项目——Data-Structures-and-Algorithms-in-cpp,正是一扇通往这一编程领域深处的大门,等待着所有渴望深入学习数据结构与算法的开发者们。 项目介绍 Data-Structures-and-A...

gitblog_00476的博客 1199

深度探索C++对象模型

深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C++第一套编译器cfront的设计者所写. 了解C++对象模型, 有助于在语言本身以及面向对象观念两方面层次提升. explicit(明确出现于C++程序代码). implici...

Shirven 234

深度探索C++对象模型pdf

下载地址:网盘下载内容简介······这本书探索“对象导向程序所支持的C++对象模型”下的程序行为。对于“对象导向性质之基础实现技术”以及“各种性质背后的隐含利益交换”提供一个清楚的认识。检验由程序变形所带来的效率冲击。提供丰富的程序范例、图片,以及对象导向观念和底层对象模型之间的效率测量。举报作者简介······Stanley B...

weixin_30301449的博客 1329

深度探索C++对象模型Data语义学小测试

为了加深对虚拟继承中派生类对象的成员分布关系,测试了一下书本里的example,对于不使用虚拟继承的对象在成员分布上就比较简单,即使是多重继承对应的直接基类子对象也是完整的,基类指针指向派生类对象(现在知道严格来说是指向派生类的对应基类部分)只需要加上相应偏移即可,不需要加入新的指针结构增加一层中间逻辑,而虚拟继承中会引入不变局部和可变局部部分,都是将虚基类对象部分独立出来,每个子对象部分用指针指

小菜鸟的足迹~ 1101

深度探索C++对象模型】第三章 Data语意学

C++对象模型尽量以空间优化和存取速度优化的考虑来表现nonstatic data members,并且保持和C语言struct数据配置的兼容性,它把数据直接存放在每一个class object中。对于继承而来的nonstatic data members也是如此。不过并没有强制定义其间的排列顺序。至于static data members,则被放置在程序的一个global data segmen...

stt2019 343

问答学习《深度探索C++对象模型》系列

经过数次翻看《深度探索C++对象模型》和翻看别人的笔记,还是决定自己动手写一下该本书的笔记。笔记采用问答的方式是因为在UC实习时我的指导老师的影响:你不要为了看书而看书,你要从中学到东西就要带着疑问去学习。于是有了这一系列的笔记,感谢我的指导老师让我明白:生命不息,学习不止。 第一章:《深度探索C++对象模型》读书笔记之关于对象 第二章:《深度探索C++对象模型》读书笔记之构造函数语意学 第

冰枫的随笔 1323

深度探索C++对象模型 3Data语意学

第三章 Data语意学 已知如下程序: #include using namespace std; class X{}; class Y: public virtual X{}; class Z: public virtual X{}; class A: public Y,public Z{};   int main(){     cout sizeof(X)

walkerkalr的专栏 1233

深度探索C++对象模型之第三章:data语义学中对象布局

说明: 看到  http://www.roading.org/?p=545 已经整理的很好了,所以前部分大部分引用原文,感谢原作者@~@,后半部分主要引用自书本 类对象占用的内存空间可能比我们想象的要大,有如下原因: (1) 由编译器自动加上额外的data memebers,用以支持某些语言特性(主要是各种virtual特性) (2)因为边界调整(alignment)的需要(详细请看:内存对

菜根 822

深度探索C++对象模型3Data语意学 3.1 data member的绑定

每一个class object必须有足够的大小以容纳它所有的nonstatic data members。有时候其值较大,原因是: 1、由编译器自动加上额外data members,用以支持某些语言特性(主要是各种virtual特性) 2、因为alignment(边界调整)的需要。(如:一些机器要求结果为4bytes的倍数)。 ...

沟沟沟的博客 196

深度探索C++对象模型-Data语义学

c++对象模型

isunn的专栏 1426

拾遗与填坑《深度探索C++对象模型3.3

33Data Member的存取 背景介绍 本节篇幅较短核心内容讲的就是,如下代码的存取效率问题:

果冻虾仁 3538

读书笔记(一)深度探索C++对象模型

一.C++对象模型(The C++ Object Model) 在C++中有两种成员数据:static data members(静态) 以及non-static data members(普通非静态); 三种成员函数:static member function(静态成员函数), non-static member function(一般非静态成员函数)以及virtual member f...

weixin_44071945的博客 177
上一篇: 《深度探索c++对象模型》学习笔记 - 2 构造函数语义学
下一篇: 《深度探索c++对象模型》 学习笔记 - 4 Function语义学
sandyzhs
博客等级 码龄22年 79粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值