《深度探索C++对象模型》--3 Data语意学
1、Data Member的绑定
(1)“memberrewriting rule”,一个inline函数实体,在整个class声明未被完全看见之前,是不会被评估求值的。所以通常将inline定义放于类声明之外。
(2)但是对于argumentlist中的名称还是会在第一次遭遇时适当地决议。在extern和nestedtype name之间 非直觉绑定操作还是会发生,为了避免此种问题,总是把“nested type name”放于class的起始处。
2、Data member的布局
C++standard,在同一个accesssection(private等)中,members的排列只需符合“较晚声明的members在classobject中有较高的地址”即可,即members并一定连续排列。
3、Data member的存取
(1)对于staticdata members,存放在程序的datasegment中,不在于classobject中。获取一个指向其的指针时,会得到一个指向其数据类型的指针。对于不同class的同名staticdata member会采用一种机制来处理。
(2)对于nonstaticdata members,必须与classobject相关联。当用一个memberfunction 处理nonstaticdata members,会发生“implicitclass object”,即添加this指针。存取时需要在class object的起始地址再加上偏移地址。
4、“继承”与Data member
(1)多重继承时,多重派生对象和最左端的base class具有相同的起始地址,至于第二或后续的base class的地址需要加(减)中间的base class subobjects的大小。
5、对象成员的效率
对于关心效率的操作,应该实际测试,而不能推断,而且某些优化操作不一定进行。
6、指向data members的指针
(1)区分“没有指向任何data member的指针”和“指向第一个data member的指针”?
每个真正的member offset的值都被加上1,所以编译器取地址时一般都减1。
(2)取一个nonstatic data member的地址,会得到在class中的offset,而取一个绑定于真正的class object身上的data member的地址,将会得到该member在内存中的真正地址,然后减去offset就会得到。
《深度探索C++对象模型》--3 Data语意学相关推荐
- 深度探索C++ 对象模型(6)-Data member的存取
nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...
- 深度探索C++ 对象模型(6)-Data member的绑定
防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...
- 深度探索C++ 对象模型(7)-Data member的布局(虚继承)
虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)
无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...
- 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学
<深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...
- 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学
<深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...
- 深度探索C++对象模型第2章 构造函数语义学
默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...
- [读书笔记]《深度探索C++对象模型》
文章目录 前言 思维导图 第一章 关于对象 第二章 构造函数语意学 构造函数 拷贝构造函数 初始化列表 第三章 Data 语意学 第四章 Function 语意学 非静态成员函数 静态成员函数 虚成员 ...
最新文章
- 【原】为DevExpress的ChartControl添加Y轴控制 和 GridControl中指定列添加超级链接
- 妙用 Intellij IDEA 创建临时文件,Git 跟踪不到的那种
- Java变量的修饰符
- 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
- Postgres主进程文件—postmaster.pid
- 将Notepad++配置为Ruby编译器
- 【NeurIPS2020】Google点针图网络,Pointer Graph Networks
- Android Studio的Android Monitor窗口中把标签拉出来之后放不回去的解决方法
- 爬了7000+条内衣信息,只为探究妹纸们的偏好!
- 拓端tecdat|R语言用Hessian-free 、Nelder-Mead优化方法对数据进行参数估计
- Unity学习日志_NGUI简介
- python气象数据分析_气象数据分析--数据预处理
- 2022年地理信息系统与遥感专业就业前景与升学高校排名选择
- python将图片转为矢量图
- 合同html样式,css 合同打印print--水印
- dvm_lock_sample 解析
- 火狐开发----Web开发者工具
- Js逆向教程19-websocket介绍
- python:实现红黑树算法(附完整源码)
- 如何管理和使用哪些命令操作MySQL数据库?(基本操作,SQL语言,DDL,DML,DQL,DCL,Windows字符和图形界面MySQL安装)