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

深度探索C++对象模型 【第四章2】 1:关于取地址的艺术~ 直接取一个非静态成员变量的地址时,得到的是其在class中的真实offset再加1。当绑定到真实的对象上再取其地址时,得到的是其在内存中的真正地址。取一个非静态成员函数的地址时,得到的是其在内存中真正的地址,但是要存取该函数,也需要对象的地址来配合。直接存取一个静态成员变量的地址时,无论通过对象还是class,得到的都是其在内存中的真正地址。直接存取一个静态成员函 阅读详情
 笔记贴出后,有朋友便给我提出了一个很好的建议,原文如下:
史列因:我刚看了你写的“深度探索C++对象模型(1)”,感觉很不错。不过我有一个建议:你说“谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生”是很自然的。第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了。第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了。这本书中很多内容都是前后重复的。我建议你先不管看懂看不懂,只管向后看,之后再从头看几遍,那样效果好得多。
我想史列因说的应该是一种非常好的阅读方式,类似《深度探索C++对象模型》这样的技术书籍,需要的是理解,和学习英文不同,不能靠死记硬背,如果出现理解不了的情况,那你不妨将书放下,打一盘红警(俺骄傲的说,我是高手)。或者跳过去也是一个不错的方法。好了,我们还是继续研究C++的对象模型吧。

简单的对象模型
看书上的例子(注释是表示solt的索引)
Class Point
{
public:
Point(float xval); //1
virtual ~Point(); //2

float x() const; //3
static int PointCount(); //4
protected:
virtual ostream& print(ostream &os) const; //5
float _x; //6
static int _point_count; //7
}
每一个Object是一系列的Slots,每一个Slots指向一个members。

表格驱动对象模型

当构造对象时便会有一个类似指针数组的东西存放着类数据成员在内存中位置的指针,还有指向成员函数的指针。为了对一个类产生的所有对象实体有一个标准的表达,所以对象模型采用了表格,把所有的数据成员放在数据成员表中,把所有的成员函数的地址放在了成员函数表中,而类对象本身有指向这两个表的指针。

为了便于理解,雷神来举个不恰当的例子说明一下,注意是不很恰当的例子

我们把写字楼看成一个类,写字楼中的人看成是类的数据成员,而每一个租用写字楼的公司看成类的成员函数。我们来看一个实体,我们叫它雷神大厦。雷神大厦的物业管理部门需要登记每个出入写字楼的人,以便发通行证,并且需要登记每个公司的房间号,并制作了一个牌子在大厅的墙上。实际上这便是类的对象构造过程。你可以通过大厅墙上的公司列表找到任何一家在雷神大厦租房的公司,也可以通过物业提供的花名册找到任何一个出入雷神大厦的人。

真是一个考验大家想象力的例子。(如果你有更好例子的别忘了和雷神交流一下)。

C++的对象模型
C++对象模型是从简单对象模型派生得来,并对内存空间和存取时间做了优化。它引入了虚函数表(virtual table)的方案。每个类产生一堆指向虚函数的指针,放在表格中。每个类的对象被添加了一个指针(vptr),指向相关的虚函数表(virtual table)。而这个指针是由每一个类的constructor、destructor和copy assignment运算符自动完成。

我们还用上面的雷神大厦举例,物业管理为了提高效率,对长期稳定的公司和人员不再登记,指对不稳定或不能确定的公司进行登记,以便于管理。
再次考验大家的想象力。

得出结论,C++对象模型和双表格对象模型相比,提高了空间和存储时间的效率,却失去了弹性。

试想一下,没有整个雷神大厦人员和公司的名录,如果他们发生变化,则需要物业管理部门做很多工作。重新确定长期稳定的公司和人员是那些。对应应用程序则需要重新编译。(这次更离谱,但为了保持连贯,大家请进行理解性的思考,不要局限字面的意思)

深度探索C++ 对象模型【第二章2】 1:NRV的优化会出现在,函数以传值的方式传回一个类对象,当该类有一个拷贝构造函数时,编译器会对你的代码进行一定的背后优化。 2:成员初始化时,当出现以下四种情况,必须使用成员初始化列表的操作: 初始化一个引用reference成员时初始化一个常量const成员时当调用一个base的构造函数,而基类的构造函数拥有一组参数时当调用一个成员类对象的构造函数时,且该成员类的构造函数拥 阅读详情

相关推荐

深度探索C++对象模型【第三章2】

1:通过对象指针还是对象来存取数据成员之间的差异: 当该类是一个派生类,且其继承链中有一个虚基类存在,并且存取的member成员是一个从该虚基类中继承而来的成员时,就会有重大的差异。此时通过指针来存取的话,由于多态机制的存在,指针所绑定的对象类型要到执行期才能确定,所以存取的操作也必须延长到执行期;但是如果使用对象来存取,就不会有这样的问题存在,成员的offset在编译器就能够确定。

MISAYAONE的博客 848

深度探索C++对象模型(2)

zzy5177的专栏 292

【深度剖析】三一重工的数字化转型(中篇)

三一重工在数字化转型方面取得了提高效率、降低成本、加强研发创新和改善内控管理等多方面的成效。本研究旨在通过对三一重工数字化转型的深入分析,引导企业思考在第四次工业革命与第三次能源革命交汇的超级技术窗口期,如何进一步把握发展机遇,并为同行业其他企业提供探索性的建议。作为装备制造行业的佼佼者,三一重工的数字化转型受到了业界的广泛关注。作为行业内首批接触并实践数字化转型的企业之一,三一重工的转型经验不仅成功,而且积累了丰富的理论与实践,为其他制造业企业的数字化转型提供了可借鉴的范例。

领信卓越的博客 2306

深度探索C++对象模型(2)

 笔记贴出后,有朋友便给我提出了一个很好的建议,原文如下:史列因:我刚看了你写的“深度探索C++对象模型(1)”,感觉很不错。不过我有一个建议:你说“谁知第一章便如此的难以消化,已经反复读了3遍,还是有些夹生”是很自然的。第一章是一个总览,如果你能全看懂,后面的就没什么看的必要了。第一章的内容后面都有详细介绍,开始只要有个大概印象就可以了。这本书中很多内容都是前后重复的。我建议你先不管看懂看不懂,

Dan_Cooper的专栏 587

电源完整性之仿真设计原理

电源完整性(Power Integrity),简称为PI,也就是大家平常听说的PI。PCB板上的电源设计也是非常重要的,不当的设计也会引起很重要的影响。所以电源完整性PI和信号完整性SI,是我们互连设计人员应该同等重视的问题。今天整理本人接触的电源完整性PI的一些原理,从不的角度去看PI,会有不同的理解,下面开始喽!!! 提到互连的电源设计,可能首先想到的电源分配网络(Power Distribution Nets),因为互连电源会有许多种,直流DC和交流AC,还有不同的电压调节模块(VRM)与不同的负载端

刘小同学的博客 7375

QT/C++实现健壮HTTP POST客户端:从基础到异常处理与性能优化

HTTP协议作为客户端与服务器通信的基石,其POST方法在数据提交、API交互等场景中扮演着核心角色。其工作原理基于请求-响应模型,通过封装TCP连接与协议细节,为应用层提供了简洁的数据传输接口。在C++桌面与嵌入式开发中,直接使用底层Socket实现HTTP不仅复杂且易出错,而利用框架进行高级封装能显著提升开发效率与代码健壮性。QT框架的`QNetworkAccessManager`等组件正是为此设计,它通过信号槽机制提供异步网络编程模型,有效管理连接与协议解析。一个健壮的HTTP客户端需要妥善处理网络波

weixin_29176179的博客 384

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

转载:http://blog.youkuaiyun.com/dwater/article/details/770799 Inside The C++ Object Model Stanley B. Lippman   屋檐下的水滴--读书笔记系列 http://blog.youkuaiyun.com/dwater   《深度探索C++对象模型》读书笔记                        

ahuang1900的专栏 1007

基于R语言的PLS算法实现解读

我们使用"pls"包来执行PLS回归,并提供了相应的源代码。在本文中,我们将详细解读基于R语言的PLS算法的实现过程,并提供相应的源代码。PLS算法的实现可以借助R语言中的"pls"包。该包提供了丰富的函数和工具,用于执行PLS回归、PLS-DA(PLS-Discriminant Analysis)和其他相关任务。除了执行PLS回归,"pls"包还提供了其他功能,例如PLS-DA(用于分类问题)和PLS变量选择等。上述代码将基于输入的X值,使用训练好的PLS模型进行预测,并返回预测结果。

TechWhizKid的博客 1046

深度探索cpp对象模型(1)(2)

第一章 关于对象 指针其实存的就是一个地址,不管啥类型的指针大小都是一样的,对不同类型的指针,怎么知道要读多少字节,这是编译器干的事情,指针类型告诉编译器,我到底要读多少字节。 32位,指针大小4个字节,64位8个字节 由此引申开来,不能用void * 操作对象,针对void *指针的static_cast,其实是一种编译器指令,并没有改变一个指针所含的地址 第二章 构造函数语意学 ...

speargod的博客 386

CAN轴控制流【6041,6040】

【代码】CAN轴控制流【6041,6040】

cfqq1989的博客 1783

WorkBuddy 技能指南:基础办公与文档处理

WorkBuddy 不仅仅是一个对话工具——它通过技能(Skills)系统,将通用 AI 助手转变为具备专业领域能力的智能助手。每个技能都是一套经过精心设计的"能力包",包含专业知识、工作流程和专用工具。本文聚焦于文档处理类技能——这是日常工作中使用频率最高、最实用的能力集合。

u011186532的专栏 704

《深度探索C++对象模型》读书笔记2:C++对象模型,我的虚拟函数被放在哪里?

首先,让我们来看一下C++类对象中,各种成员是如何布局的,即C++对象模型。本篇内容也是今后讨论C++底层经常要用到的,因此在进一步深入研究C++的其他主题之前,了解一下本文的内容是非常必要的。C++对象模型,从简单对象模型到表格驱动对象模型,几经演变,最终形成了C++标准中的对象模型。 1、C++对象模型众所周知,在C++类中,有两种数据成员:static和nonstatic,三

宁静致远 1417

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

本文介绍了WinForm开发中OpenFileDialog控件的关键属性及其应用。OpenFileDialog是.NET Framework提供的文件对话框控件,主要用于选择、打开文件操作。文章详细讲解了11个核心属性:AddExtension(自动补全扩展名)、AutoUpgradeEnabled(外观升级)、CheckFileExists/CheckPathExists(文件/路径存在验证)、DefaultExt(默认扩展名)、DereferenceLinks(解析快捷方式)、FileName/File

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1534

《深度探索C++对象模型》读书笔记(2)。

default constructor仅在编译器需要它时,才会被合成出来。    通常来说,由编译器合成出来的default constructor是没啥用的(trivial),但有以下几种例外:    (1)带有“Default Constructor”的Mem

ithzhang 1927

32、生物医学中的多模态拉曼散射成像技术

本文综述了多模态拉曼散射成像技术在生物医学领域的应用,重点探讨其在肿瘤研究、癌症无创诊断和组织功能分析中的前沿进展。通过结合自发拉曼、相干拉曼散射(CARS/SRS)、光学相干断层扫描(OCT)、荧光寿命成像(FLIM)及多光子显微技术(TPEF/SHG)等多种模态,实现了对细胞和组织的高特异性生化信息与高分辨率形态学特征的同步获取。文章还介绍了多模态SERS纳米探针的设计及其在靶向成像与治疗一体化中的潜力,并系统分析了不同成像方式的操作流程、优势互补性及临床应用场景。最后展望了该技术向小型化、智能化和个性

zzz56的博客 153

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c++ ---深度探索C++对象模型读书笔记1-2

简单的对象模型:一个class object 的大小等于指针大小,乘以类成员的数量,原因是因为类对象中只保存类成员的slot。成员本身并不存在对象中,只有指向成员的指针存在对象中,是因为成员的类型不同,申请的内存不同的存储空间。 表格驱动对象模型:把所有与memebers相关的信息抽出来,放在一个data member table 和一个member function table中,class object 本身则内含指向这两个表格的指针。 C++ 对象模型:非静态成员被配置在每一个class obje

heary29的专栏 421

计算机控制技术及应用

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Inside the C++ Object Model 深度探索对象模型 1-Object, 2-Constructor

前言摘录 >BarbaraMoo常说 管理一个团队 就像放牧一群骄傲的猫. 1 关于对象Object >参数化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 template class type, int

Fix it 989

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

3章2节 Data Member的布局 背景介绍 访问区(access section)即是指private、public、protected下面的代码区域。当然在类中同一种访问区可以多次声明,视作多个访问区,如:

果冻虾仁 3040

深度探索C++对象模型笔记 [2] 数据(Data)语意学

本文主要参考Stanley B.Lippman所著《Inside the C++ Object Model》,侯捷译。 前言 一个表面看上去是空的类,其实并不是空的!因为编译器为它安插了一个隐藏的char,这样使得这个类被实例化后,每个对象都有独一无二的地址(即这个char的地址)。 一个class的data members,一般而言,可以表现出class在程序执行时的某种状态。Nonsta...

Alfeim的博客 526

深度探索C++ 对象模型【第五章2】

1:当C++类导入继承机制,出现虚函数之后,vptr使得class产生了膨胀作用 构造函数附加了代码,将vptr初始化class必须合成一个拷贝构造函数和赋值构造函数,其现在是nontrival的(简单的位拷贝不能满足需求)。但其默认的析构函数仍然是trival的 2:C++标准要求编译器尽量延迟必要成员函数(构造、拷贝)的实际合成操作,直到真正需要时才合成。 3:拷贝构造函

MISAYAONE的博客 692

深度探索C++ 对象模型(2)-类的对象的内存大小_2

继续上文,看看继承类的大小 1. Bear类 类对象的大小为24: 16+8 class Bear : public ZooAnimal { public: Bear() {}; ~Bear() {}; void rotate() {}; virtual void dance() {}; protected: enum Dances { }; Dances dances_known; int cell_block; }; Bear b; ZooAnimal *pz = &b

thefist的专栏 259

深度探索C++ 对象模型(5)-Initialization list(2)

Initialization list的作用是效率 如下代码可以编译并运行,但是效率低下 class Word { String _name; int _cnt; public: Word() { _name = 0; _cnt = 0; // 是否使用initialization list 都是相同的 } }; 其等价于 Word::Word(

thefist的专栏 463

深度探索C++对象模型 chapter 2

Chapter 2 构造函数语意学 Q : 一个空类 默认产生哪些成员函数A: 构造函数,析构函数, 拷贝构造函数,赋值运算符,取址运算符, 取址运算符 const 2.1 Default Constructor 的构造操作 Q: 什么时候才会合成一个default constructor ? A: 当编译器需要它的时候。 Q: 什么时...

weixin_33994444的博客 99
上一篇: 深度探索C++对象模型1
下一篇: 转:临界区,互斥量,信号量,事件的区别
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值