《深度探索C++对象模型》笔记——Data语意学
Data Member的绑定
- inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生。
- argument list中的名称还是会在它们第一次遭遇时被适当地决议。
- 为避免错误,早期出现三种防御性代码风格,把data members放在class声明开始处,把inline functions放在class声明之外,把nested type声明放在class的起始处。
Data Member的布局
- static data members放在程序的data segment中,和class objects无关。
- 同一个access section中的data members的排列符合较晚出现的data members在class object中有较高的地址。
- 允许多个access section中的data members自由排列。
- derived class members和base class(es) members可以自由排列。
- 在大部分编译器上头,base class members总是先出现,但属于virtual base class的除外。
- 编译器内部产生出来的data members可自由地放在任何位置上。
Data Member的存取
- 通过对象、引用或指针存取一个static data member的成本是一样的,存取许可不会招致任何空间上或时间上的额外负担。
- 通过对象、引用或指针存取一个nonstatic data member的成本,其效率和存取一个C struct member或一个nonderived class的member(单一继承或多重继承)是一样的(多重继承的时候,members的位置在编译时就固定了,存取members只是一个简单的offset运算)。
- 通过引用或指针比通过对象存取一个virtual base class的member的速度会稍慢一点(我们不知道这个引用或指针指向哪一种class type,也就不知道编译期这个member真正的offset的位置,所以这个存取操作必须延迟至执行期,经由一个额外的间接导引,才能够解决)。
继承与Data Member
- 单继承的时候,出现在derived class中的base class subobject有其完整的原样性。
- 单继承加上多态的时候,vptr放在class object的前端,对于“在多重继承之下,通过指向class members的指针调用virtual function”,会带来一些帮助。当然这样就丧失了,vptr放在class object尾端对C语言的兼容性。
- 多重继承的时候,对于一个多重派生对象,将其地址/指针指定给第二个或后继的base class的地址/指针,需要将地址/指针内部转化后再进行指定,有时内部转换操作还需要一个条件测试。
- 虚拟继承的时候,为支持virtual base classes,在derived class中会添加一个指针,它或者指向virtual base class subobject(固定时间负担,不因virtual base classes的个数而有所变化),或者指向一个相关表格(固定时间负担,不因虚拟继承的尝试而改变),表格中存放的若不是virtual base classsubject的地址(Visual Studio)就是其偏移地址(CodeBlocks)。
指向Data Member的指针
- 取一个static data member的地址得到的将是它在内存中的地址,类型是一个指向其数据类型的指针,而不是指向其class member的指针。
- 取一个nonstatic datamember的地址,将会得到它在class中的offset,类型是一个指向其class member的指针。
- 取一个绑定于真正class object身上的data member的地址,将会得到该member在内存中的真正地址,类型是一个指向其数据类型的指针。
《深度探索C++对象模型》笔记——Data语意学的更多相关文章
- 【深度探索C++对象模型】data语义学
class X{}; class Y :public virtual X{}; class Z :public virtual X{}; class A :public Y, public Z{}; ...
- 《深度探索C++对象模型》读书笔记(一)
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...
- 读书笔记《深度探索c++对象模型》 概述
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
- [读书系列] 深度探索C++对象模型 初读
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...
- 深度探索C++对象模型
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 拾遗与填坑《深度探索C++对象模型》3.2节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 柔性数组-读《深度探索C++对象模型》有感 (转载)
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- 柔性数组-读《深度探索C++对象模型》有感
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
随机推荐
- 可能是最简单的方式:利用Eclipse创建基于Maven的Web项目
1. 新建一个maven项目 2.在弹出框中选择创建一个简单项目 3. 然后输入参数,需要注意的是,在packagin中,选择war,web项目应该选择war 4. 点击finish后,基本项目结构就 ...
- 根据浏览器UA信息进行跳转(移动和pc)
如何用php判断一个客户端是手机还是电脑?其实很简单,开发人员都知道,通过浏览器访问网站时,浏览器都会向服务器发送UA,即User Agent(用户代理).不同浏览器.同一浏览器的不同版本.手机浏览器 ...
- HDU 5692 (DFS序+线段树)
DFS获得从0到每一个顶点的距离,同时获得L和R数组.两数组为遍历时从i进入再从i出来的序列. #pragma comment(linker, "/STACK:1024000000,1024 ...
- mysql的一些特殊命令
mysql命令行工具的编辑技巧 从mysql performace blog 中学到的: 1. pager 例子 mysql> pager more PAGER set to 'more' my ...
- openjdk
apt-get install mercurial hg clone http://hg.openjdk.java.net/jdk8u/jdk8u20/ jdk8u20 ./get_source.sh
- PAT (Advanced Level) 1029. Median (25)
scanf读入居然会超时...用了一下输入挂才AC... #include<cstdio> #include<cstring> #include<cmath> #i ...
- CodeForces 614D Skills
排序+枚举+二分 最大的那些变成A,小的那部分提高最小值 #include<cstdio> #include<cstring> #include<cmath> #i ...
- hibernate--联合主键--annotation
有3种方式: 1.@Embeddedable 2.@EmbeddedId 3. @IdClass 2,3 最常用 一, @Embeddedable 1.新建TeacherPK.java, 加入@Emb ...
- 手机web——自适应网页设计(html/css控制) - 51CTO.COM
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- 基于Apache搭建Nagios图形监控
基于apache 的稍微简单一点么?实验一下子就OK了... 环境: System: [root@losnau etc]# cat /etc/issueRed Hat Enterprise Linux ...