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

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

本章主要讲述了以下内容:Data Member的邦定,Data Member的布局,Data Member的存取,继承与Data Member,对象成员的效率,指向Data Member的指针。

Data Member的邦定主要讲述了以下内容:

该部分讲述了一个例子,通过例子和说明我们可以得出一个结论。那就是:在一个类一面要把类型定义和变量定义方在最开始的位置,特别是在模板代码中。

Data Member的布局主要讲述了以下内容:

在类或者结构中一般情况是按照成员变量的声明顺序按照从低地址到高地址的顺序方式排列。上述规则只是一个普遍的实现方式而不是一种强制规定,唯一的规定是在一个访问段中的后出现的一定比先出现的变量位于更高的地址。在不同方位段中的变量排列也无任何强制的要求。

Data Member的存取主要讲述了以下内容:

通过阅读我们可以得出如下结论。如果访问的一个数据成员是静态成员,那么无论通过何种方式访问,存取的效率都是相当高且是固定的。如果访问的数据成员不是某个虚基类的成员那么访问方式也是固定和高效的。如果访问的成员变量是某个序基类的成员,那么访问是有些低效的,因为访问是间接。

继承与Data Member主要讲述了以下内容:

该小节是本章的主要内容,但是该节将的内容比较不太容易理解且比较零碎,具体内容可以阅读本书。我们可以得出的结论就是:随之类的复杂性加大(丛简单的类到从多继承虚拟基类),数据成员的布局也随之复杂,且子类和基类的转换也更加复杂。

对象成员的效率主要讲述了以下内容:

该小节主要给出了几种不同访问数据成员的方式及其效率。我们可以看出在优化开启的情况下效率几乎没有差别。

指向Data Member的指针主要讲述了以下内容:

什么是Data Member的指针,和该指针多加1的情况和原因。但是在VC6.0上试验没有发现多加1的情况,原因可能和书中候捷所说的相同。

[读书笔记] -深度探索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 阅读详情

相关推荐

C++对象模型 第三章 数据语义学

第三章 数据语义学 文目录数据成员绑定时机进程内存空间数据成员布局数据成员存取单一继承下的数据成员布局单类 单继承 下虚函数的数据成员布局多重继承数据布局与this调整深谈 !虚基类问题的提出和初探两层结构时虚基类表内容分析 —— 针对 VS 2017三层结构时虚基类表内容分析成员变量地址、偏移、指针等重申 数据成员绑定时机 总结: ==编译器对 成员函数myfunc的解析,是整个A类定义完毕后才开始;==因为只有整个类A定义完毕后, 编译器参能看到类A中的myvar,才能根据时机的需要把出现myva

qq_53111905的博客 777

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

深度探索C++对象模型读书笔记Data语意学 类的大小(sizeof) 一个空类的大小通常为1,是因为编译器为其安插了一个char,以便这个类的任意两个object能够在内存中配置独一无二的地址。 一个类的大小通常与机器和编译期有关,受以下三个因素的影响: 1. 语言本身的额外负担 比如支持虚函数,或者虚继承。 2. 编译器对于特殊情况的优化处理 某些编译器会对empty...

yhcuac 1082

深度探索C++对象模型 第三章读书笔记

今天阅读了《深度探索C++对象模型》的第三章,对于C++编译器所做的事又了解了不少,下面来总结一下:          1. 对于一个空类它的大小并不是直观上的0,因为假设定义了一个对象如果它的大小是0的话,那么它返回的地址就无法使用。所以编译器会为它添加一个byte,用来标识两个对象独一无二的地址。一个派生类继承这个空类的话,有些编译器会针对empty virtual base class进...

qq_31984717的博客 234

C++对象模型-Data语义学 第三章笔记

class A; class B:public virtual A; class C: public virtual A; class D: public B,public C此种情况下一般 A的大小为1,sizeof(B)=sizeof©=8;因为B,C中包含指向虚基类的一个指针。sizeof(D)为12,因为A中一字节+B中一个指针+C中一个指针=9,由于需要内存对齐的原因会padding至12。 若编译器处理了empty virtual base class 则A中不会有1字节的插入占位。上述计算就会

nwao7890的专栏 262

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

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的专栏 749

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

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

冰枫的随笔 1323

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

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

阿龙的博客 168

深度探索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的博客 250

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

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

Ron的专栏 930

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

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

冰枫的随笔 1437

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

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

weixin_30340775的博客 155

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

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

for_wind的专栏 1393

深度探索c++对象模型读书笔记Data语意学-Data Member的绑定

一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值(evaluated)的,也就是说,对于如下代码: 1 extern int x; 2 3 class A 4 { 5 public: 6 ... 7 //对于函数本体的分析将延迟,直至class申明的}出现时才开始。 8 float X() const {...

weixin_30900589的博客 117

深度探索c++对象模型读书笔记Data语意学-继承与Data member中内存对齐问题

书中在继承之后内存对齐问题上说道下面代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 class A 4 { 5 private: 6 int val; 7 char bit1; 8 }; 9 class B : public A 10 { 11 private: ...

weixin_30527143的博客 141

[读书笔记]深度探索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的博客 268

[读书笔记]深度探索C++模型_第四_Function语意学

4.1 Member 的各种调用方式 Nonstatic Member Functions 编译器内部已将“member函数实例”转换为对等的“nonmember函数实例” 例如 float Point3d::magnitude() const { return sqrt(_x*_x + _y*_y + _z*_z); } 会被转换为 float magnitude3d(c...

xy_cpp的博客 260
上一篇: 第2章 构造函数语意学-《深度探索C++对象模型》读书笔记
下一篇: 一个高效的定时器分析及设计
worldvacuum
博客等级 码龄17年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值