《深度探索C++对象模型》读书笔记第三章:Data语意学

机器学习 线性回归 头歌实训 第1关:简单线性回归与多元线性回归 第2关:线性回归的正规方程解 第3关:衡量线性回归的性能指标 第4关:scikit-learn线性回归实践 - 波斯顿房价预测 阅读详情


这是第三章,第三章当时我的博客: C++对象模型Data语意学分析、虚继承底层实现机制 写的比较详细,所以这次可能总结会少一些。


  1. 关于 class 的大小分析上面提到的博客有详细分析。
  2. 对于 origin.x=0.0 和 pt->x=0.0 两种方式存取数据有什么重大差异?答案是:当调用类是一个派生类,而且在其继承体系中有一个虚基类,并且被存取的成员(如本例的x)是一个从该虚基类继承而来的成员时,就会有重大的差异。因为这时候不能够确定 pt 必然指向哪一种 class 类型(可能多个派生类,不能在编译器确定成员的 offset),所以这个存取操作必须延迟至执行期,经由一个额外的间接导引,才能解决。但如果使用 origin,就不会产生这些问题,其类型无疑是确定的,即使继承自虚基类,虚基类成员的 offset 在编译器就固定了。一个好的编译器甚至可以静态地经由 origin 就解决掉对 x 的存取!
  3. 在继承体系中,派生类不会去覆盖基类的内存对齐部分,这样是为了避免当基类赋给派生类时,不会覆盖掉派生类增加的成员。
  4. 多重继承中,如果要存取第二或后继基类中的一个数据成员,需要付出额外的成本吗?不,成员的位置在编译时就固定了,因此存取成员(data member) 只是一个一个简单的 offset 运算,就像单一继承一样。
  5. g++针对虚继承的处理:g++将虚基类子对象的 offset 也放入了虚函数表当中,虚函数表中属于同一个类对应的信息按顺序分别为:(1)typeinfo,用来支持 RTTI。(2)虚指针到整个对象开始处的偏移值。(3)虚基类子对象偏移量。(4)虚函数地址。
  6. 为什么把虚基类子对象也要放入 vtbl 中呢?因为(1)可能继承自多个虚基类,难道派生类中需要多个指针指向不同的虚基类子对象吗?无疑是浪费。不如放一张表把他们放在一块,只需一个指针就可以了。(2)如果有嵌套虚基类(一个虚基类继承自另一个虚基类),使用指针的话,那就需要先访问第一个,再访问第二个。如果嵌套 更深,那复杂度无疑是一场灾难。
  7. 为了区分一个 ”没有指向任何数据成员” 的指针和一个 “指向第一个数据成员“ 的指针,所以真正的成员 offset 值都被加上1。&point3d::z 返回的是 z 在 class 中的偏移量,类型是 point3d::* 类型。而 &origin.z ,取一个类对象成员的地址,返回的是该成员在内存中真正的地址。


完了,貌似有点短,实际上这章比较长的,不过细节内容都在我开头提过的博客中,已经分析过一遍了。



【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形 本文介绍了在Unity中使用Navigation导航系统和LineRenderer实现3D人物寻路轨迹预测效果的方法。通过NavMesh.CalculatePath计算路径点,结合Physics.Raycast进行地面点投射,将路径点赋予LineRenderer渲染出移动轨迹。关键点包括:1)利用NavMesh.CalculatePath计算两点间可行走路径;2)通过射线检测获取地面点提高路径适配性;3)使用协程定期更新路径绘制。文章还提供了完整代码实现,并说明需要将地面图层设置为Ground并进行导航网格 阅读详情

相关推荐

unity中基于NGUI实现一张图片上在某个地方挖个洞

按照策划的要求,引导时只有被引导的图片是高亮的,其余地方都是黑色半透明,如下图所示: 对应的实现shader如下: Shader "Unlit/TutorialBg" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _ClipRange0 ("Clip Vector

手机游戏开发 3698

《深度探索c++对象模型》第三章:数据成员

空虚基类与派生类占用的内存 class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{};   上述类X,Y,Z,A中都没有显式定义的数据,只表示了它们之间的继承关系,可是它们的大小都不为0: 书中给出的大小 VS2017测试的大小 sizeof X:1 sizeof X:1 sizeof Y:8 sizeof Y:4 sizeof Z:8 sizeof

JMasker的博客 700

代码实现 —— 基于 STM32 的可见光通信系统课程设计

基于STM32F103ZET6,源码如需移植,需要修改定时器捕获通道引脚,及定时器,如果你也有这个课设任务,希望对你有所帮助。

不善挽留 1万+

深度探索C++对象模型-第三章

Data语意学 一 成员变量的绑定 如果在类内部和外部出现了同名成员变量,而类的内部在成员变量声明前有内联成员函数的话,会有以下误解: extern float x; class A{ public: int func(){ return X; } private: int x; }; 这里的x不会出现绑定错误的原因,因为C++内部将内联函数放到整个类的后面进行处理,...

7now_的博客 721

高速串行信号仿真避坑指南:为什么你的SIwave Xnet设置了却不出结果?

本文深入解析SIwave中Xnet功能在高速串行信号仿真中的常见问题,包括模型缺失、网络不完整和端口设置错误等关键误区。通过详细的电路元件模型验证、网络完整性检查及端口配置指南,帮助工程师有效解决仿真不出结果的问题,提升信号完整性分析效率。

weixin_29218963的博客 252

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 427

深度探索c++对象模型第三章笔记上

Data语意学 The Semantics of Data 前言 下面四个类,它们sizeof的结果是多少呢?

Capr1corn的博客 233

微调实操一: 增量预训练(Pretraining)

《微调入门篇:大模型微调的理论学习》我们对大模型微调理论有了基本了解,这篇结合我们现实中常见的场景,进行大模型微调实操部分的了解和学习,之前我有写过类似的文章《实践篇:大模型微调增量预训练实践(二)》利用的MedicalGPT的源码在colab进行操作, 由于MedicalGPT代码比较难以理解,而且模型只能从hugging face上下载,对于一些国内服务器无法访问,我重构了代码,让训练代码更有可读性,并参考LLAMAFactory的项目,增加了modelscope上下载模型,轻松在国内服务器运行.

youbingchen的博客 6993

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

首先给出以下例子: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; sizeof(X);//1 sizeof(Y...

weixin_30664615的博客 192

YOLOv11【第六章:模型压缩与极致优化篇·第15节】YOLOv11 专用剪枝工具库使用指南!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1312

LPDDR5 学习笔记05:WCK操作详解

LPDDR5 SDRAM采用双时钟设计,写时钟(WCK)频率为命令时钟(CK)的2倍或4倍,需要通过WCK2CK同步机制解决时钟域对齐问题。该同步操作由带特殊标志位的CAS命令触发,控制器需提供半频WCK脉冲进行状态校准。同步完成后才能执行读写操作,且支持多存储体组同步和WCK常开模式以优化性能。掉电后必须重新执行同步流程,确保时钟域正确对齐。该机制有效解决了高速内存接口的时序挑战,为LPDDR5性能提升提供关键技术支撑。

一只豌豆象的博客 2005

《深度探索C++对象模型》读书笔记:第三章 Data语意学

3.1 Data Member的绑定 1.对于内联函数函数体内的data member绑定操作是在整个class声明完成之后才发生的,所以对于: extern float x; class Point3d { public: Point3d(float, float, float); float X() const { return x; } private: float x, y,...

junya_zhang的博客 252

C++性能优化:深入理解缓存一致性与伪共享

在现代多核处理器的世界里,理解缓存一致性和伪共享就像理解一个复杂社会系统的运作规则。正如心理学家阿德勒所说:"人的行为总是有目的的",CPU缓存的每一次同步也都有其深层的硬件逻辑。本文将带你深入探索这些看不见的性能杀手,以及如何在实际项目中与它们优雅共处。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 935

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

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

冰枫的随笔 1336

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

阿龙的学习笔记---《深度探索C++对象模型》读书笔记(三)--- Data语意学

占用空间: 空的基类是1字节的大小,由于编译器需要使得不同的对象有不同的地址,以及其他因素,会给空的class一个char,分配空间。如果继承这个类,那么可能会占用这1字节的空间,但新的编译器可能会优化掉,比如在32位机器上,以下两种可能性: 同名: 外部声明的同名变量,一般会被class内部的变量覆盖。 内存中 顺序: non-static data members 在 class object 中的排列顺序将和其被声明的顺序一样。 ...

阿龙的博客 168

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

读书笔记(一)深度探索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的博客 178

[读书笔记] - 《深度探索C++对象模型》第3章 Data语意学

一个空的class,如: // sizeof X == 1 class X { }; 事实上并不是空的,它有一个隐晦的1 byte,那是被编译器安插进去的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址。 1.Data Memeber的绑定 在下面的程序中,length的类型在两个member function signatuures中都解析为global typedef,也就是int。当后续再有length的nested typedef声明出现时,C++ St

浮生的博客 389

《深度探索C++对象模型》读书笔记第一章:关于对象

《深度探索C++对象模型》读书笔记之 关于对象 前言 c语言中,“数据”和“处理数据的操作(函数)” 是分开声明的,将这种程序方法称为程序性(procedural),比如声明一个struct Point3d: struct Point3d { float x; float y; folat z; }; 而操作该数据数据的函数例如打印函数,只能另外定义成: vo...

yhcuac 2435

《深度探索C++对象模型》第一章关于对象ObjectLessons之读书笔记

在C语言中,数据和函数

on-way 794

深度探索C++对象模型之Data语意学读书笔记

深度探索C++对象模型之Data语意,简单总结GCC和VC++的异同

Ron的专栏 930

《深度探索C++对象模型》读书笔记之Data语意学

1、  Data member的布局是怎样的? 非静态数据成员 1>    在同一个Access Section(也就是private,public,protected等区段)中,较晚出现的数据成员在classobject中有较高的地址。 2>    允许编译器将同一类型的多个Acess Section的顺序自由排列,而不必在乎它们的声明次序(但似乎没有编译器这样做)。

冰枫的随笔 1440

《深度探索C++对象模型》读书笔记——Data语意学【for_wind】

//整理之,分享之,欢迎指正。for_wind 1、类的实际大小。       每一个class object必须有足够的大小以容纳它所有的nonstatic data members。除了其nonstatic data members的总和大小外,其值的大小受以下三个因素影响: (1)语言本身所造成的额外负担:即为了支持virtual而由内部产生的额外负担。当语言支持virtual

for_wind的专栏 1398

【深度探索C++对象模型读书笔记】【第3章】Data语意学

1、例子,用VS 2013编译器 #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) << endl;// 1 cout

ruan875417的专栏 750

【深度探索C++对象模型读书笔记】【第5章】构造、析构、拷贝语意学

1、 一般而言,class的data member应该被初始化,而且只在constructor中或其它member functions中初始化,其它任何操作都将破坏其封装性质,使其维护和修改更加困难。 2、 可以定义并调用一个pure virtualfunction,但它只能被静态调用,不能经由虚拟机制调用。 3、 class设计者一定得定义pure virtual destructo...

weixin_30340775的博客 156

[读书笔记]深度探索C++模型_第三章_Data语意学

当我们写出以下代码并打印出它们sizeof结果: class X{ }; class Y : public virtual X{ }; class Z : public virtual X{ }; class A : public Y, public Z{ }; X、Y、Z、A的继承关系如下图所示: sizeof X、Y、Z、A 的结果为 1、8、8、12 在Visual C++ ...

xy_cpp的博客 269
上一篇: 关于NRV优化详细分析
下一篇: 《深度探索C++对象模型》读书笔记第四章:Function语意学
FreeeLinux
博客等级 码龄11年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值