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

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

Data Member布局

  • 同一个Access Section(private, public等)中,data member的顺序按照声明顺序排列,但是没有规定需要连续排序。同时编译器可能会安插一些内部的data member(比如vptr),用来支持整个对象模型。
  • 不同Access Section中,member的排列顺序由编译器决定。

Data Member存取

-X是空基类,需要安插一个char,使得class的两个objects在内存上拥有唯一的地址;
-Size(A) = 4(为了支持virtual base class而额外增加的指针) + 1(base class本身) + 3(Alignment对齐) = 8
-Size(C) = 4(A) + 4(B) + 1(X,虚拟继承被A/B所共享) + 3(对齐) = 12

class X {};    //空虚基类          sizeof(X) = 1
class A: public virtual X {};   //sizeof(A) = 8
class B: public virtual X {};   //sizeof(B) = 8
class C: public A, public B {}; //sizeof(C) = 12
  • Static Data Members
    -直接存放于Data Segment,拥有唯一实体,不存在于class object中;
    -如果两个class声明了同名static members,编译器会对class中static data member名字进行修饰,使其独一无二;
    -对static data member取址,得到该member数据类型指针;nonstatic data member取址将得到该member在类中偏移。

  • Nonstatic Data Members
    -对nonstatic data member的存取需要在class object起始地址加上该member的偏移。

class A {public: int x; int y;};
A a;
a.y = 0;  //&a.y = &a + &A::y

Data Member和继承

  • 只有继承没有多态
    -base class subobject会在derived class中保持原样。
    这里写图片描述
  • 有多态
    在很多版本编译器中vptr放在class前端。
    对于单一继承,其base class 和derived class的object都是从相同的地址开始的,其差别只是在于derived object比较大。
    这里写图片描述
  • 多重继承和虚拟继承
    这里写图片描述

总结:多继承,单继承都不会导致访问时间的增加,但是虚拟基类由于使用间接访问技术,会导致访问时间的增加。

Data语意学 本文主要介绍C++对象中数据成员的布局。 阅读详情

相关推荐

第3章 Data语义学

3.1 Data Member的绑定 类的static data members被放置在程序的global data segment,nonstatic members数据直接存放在类对象中。 类对象的实际大小,要考虑:1.由编译器自动加上的额外data members,用来支持某些语言特性;2.字节对齐的需要。 3.2Data Member的布局 nonstatic data memb...

nullganbadie的博客 269

C++ 对象模型DATA 语义

c++对象模型data语义

forget_1111的博客 1056

深度探索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++ 对象模型 第三章 Data语意学

对于下述类和继承计算上述每个类所占内存空间如下对于上述每个类的大小的讨论一个空的class,如x,sizeof(X)==1。事实上虽然X中无任何数据,但他有一个隐晦的1byte,那是被编译器安插进去的一个char,这使得这个类的两个对象得以在内存中配置独一无二的地址。x和y和z的对象布局接下来计算A的大小正常下,A应该是16bytes,但确是12bytes一个虚基类子对象只会在派生类中存在一份实体,不管他在类的继承体系中出现了多少此,类A的大小由如下几点决定。...

weixin_42375706的博客 473

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

个别Struct的数据布局 静态数据不占用对象空间,由整个类的对象共享,存储在静态变量区。 class Point3d { private: float x; static list<Point3d*>* freeList; float y; static const int chunkSize = 250; float z; }; 只要继承不要多态 关键在于保...

zhengxu_Lee的博客 379

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

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

小菜鸟的足迹~ 1101

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

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

菜根 822

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

class X{}; class Y :public virtual X{}; class Z :public virtual X{}; class A :public Y, public Z{}; void main() { cout << sizeof(X) << " " << sizeof(Y) << " " <&...

weixin_30414305的博客 73

深度探索C++对象模型Data语义学 第三章笔记

本章主要讨论类的成员变量(Data Member)的相关语义。1.Data Member 的绑定2.Data Member的布局3.3Data Member的存取可以想象,一下几种情况对Data Memeber的访问赋值有所区别:1.单一继承2.多重继承3.虚继承(virtual inheritance)4.多态下的成员操作有所区别的根本原因还是成员在对象中的存储结构。因此先理解这几种情况下对象的...

刘洋_heaven的博客 341

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

1 Data Member的绑定 对于下图的类:

豆子的collection 868

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

 1.         类对象大小受三方面的影响:1)virtual base或virtual func带来的负担;2)是否EBO;3)alignment(sizeof大全)。2.         virtual base class表示“只有一个单一而被共享的实体”,而无论出现在继承体系中多少次。3.         c++并不强制“base class subobject的内存排列

Hisense的专栏 1518

深度探索C++对象模型复习和学习 第三章 Data 语义学(The Semantics of Data

学峰的学习笔记 548

深度探索C++对象模型》之执行期语义学

全局对象: C++程序中所有的global objects都被放置在程序的data segment中,如果显式指定给它一个值,此obejct将以该值为初值。否则object所配置到的内存内容为0。 int v1 = 1024; int v2;  其中v1和v2都被配置于data segment中,v1的初值为1024,v2的初值为0。   C语言略有不同,它并不自动给设定初值。在C...

Mr_Loser的博客 214

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

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

沟沟沟的博客 196

深度探索C++对象模型 ( 第五部分 )(转)

深度探索C++对象模型(9) 介绍 当编译一个C++程序时,计算机的内存被分成了4个区域,一个包括程序的代码,一个包括所有的全局变量,一个是堆栈,还有一个是堆(heap),我们称堆是自由的内存区域,我们可以通过new和delet...

cuankuangzhong6373的博客 98

深度探索C++对象模型——5_构造、析构、拷贝语义学

深度探索C++对象模型

wogan101的博客 283

深度探索C++对象模型》 Function语义学 第四章笔记

本章主要探讨C++类的成员函数(member function):static、nonstatic、及vritual函数调用方式的区别。1.1非静态成员函数C++类的非静态成员函数(nonstatic member function)被设计为和普通非成员函数具有相同的效率。可以思考怎样将一个成员函数转化为一个非成员函数?解决这个问题,首先需要搞清楚他们之间有何区别。可以想象,最大的区别就是非成员函...

刘洋_heaven的博客 376

深度探索C++对象模型:5.构造、析构、拷贝语意学

第五章:构造、析构、拷贝语意学 考虑下面这个abstract base class声明: class Abstract_base{ public:     virtual ~Abstract_base() = 0;     virtual void interface() const =0;     virtual const char*         mumble()

walkerkalr的专栏 1397

HarmonyOS ArkTS AP读书笔记应用BookModel 采用了经典的贫血模型(Anemic Model)设计,在 ArkTS 中配合 new BookModel(...) 调用时具有极好的

健身管理类应用与之前分析的外卖、招聘等应用有本质差异——它的核心数据不是"交易"或"任务",而是"时间序列的身体状态数据":每次训练有时长、卡路里、组数、重量;每次饮食有热量、蛋白质、碳水、脂肪;每周有运动时长趋势图。这些数据的共同特征是"随时间积累,用户需要横向对比和趋势分析"。这导致健身App的数据层设计必须从第一天就考虑"历史数据查询"和"多维度聚合"的需求,而非仅关注当前单条记录的增删改查。健身应用的用户行为模式也有独特之处:用户使用健身App的目标是"坚持",而不是"一次性完成任务"。这意味着激励

2302_79499487的博客 91
上一篇: 深度探索C++对象模型-构造函数语义学
下一篇: 虚函数和纯虚函数的区别
isunn
博客等级 码龄15年 15粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值