深度探索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

【学习笔记-QGIS】 QGIS从零快速上手

安装文章参考:https://zhuanlan.zhihu.com/p/370633306。

Xcong_Zhu的博客 1万+

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

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

Dan_Cooper的专栏 587

特征图与token的区别以及两者之间的转换

特征图和token之间的联系以及两者之间的转换

mariodf的博客 1012

CentOS7下OpenVPN Access Server 2.12.0安装与智能分流配置指南

本文详细介绍了在CentOS7系统上安装OpenVPN Access Server 2.12.0并进行智能分流配置的完整指南。从环境准备、核心安装到智能分流策略的深度配置,提供了经过验证的优化方案和故障排查技巧,帮助用户实现高效的VPN网关部署和流量管理。

weixin_30546189的博客 290

《深度探索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

数学建模灵敏性分析(一阶、二阶灵敏度)python代码+懒人专用版

对于勉强看懂了灵敏度分析的同学来说,本文给出一个方便移植、修改的python程序,可以很方便地进行灵敏度分析。

春江花朝秋月夜 1万+

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

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

speargod的博客 386

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

ESP32-IDF开发之旅 网络篇⑩ Web配网

本文介绍了基于ESP32S3的Web配网实现方案。作者通过移植开源项目,在ESP32S3上实现了WiFi配置功能,包括AP模式创建、HTTP服务器搭建、NVS存储读写等核心功能。文章详细解析了代码结构,包含WiFi初始化、事件处理、NVS存储管理和HTML页面服务等关键模块。实现方案采用AP+STA双模式,支持通过网页扫描WiFi并保存配置信息,适用于物联网设备的网络配置场景。代码中使用了FreeRTOS任务、ESP-IDF事件组等技术,并提供了完整的错误处理和日志记录功能。

单片机菜鸟哥的博客 351

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

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

宁静致远 1417

设备接入与APP(应用程序)接入华为云iotDA平台的详细操作步骤及获取方式

设备及APP(应用程序) 登录 IoTDA 平台所需的 入场与操作清单内容,提供逐项详细操作步骤和获取方式,并穿插贴士便于理解与实际操作落地。内容基于 华为云 IoTDA 控制台 和 IAM 控制台 的实际使用路径整理。

hy行者勇哥的博客 3059

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

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

ithzhang 1927

【数据同化第一期】基本概念介绍

【数据同化第一期】基本概念介绍

WW、forever的博客 1904

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

heary29的专栏 421

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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、付费专栏及课程。

余额充值