《深度探索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的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
随机推荐
- Quartz总结(一):Quartz集成Spring的2个方法
零.引言 关于Spring集成Quartz有2种方法: 1. JobDetailBean. 2. MethodInvokeJobDetailFactoryBean. 以下从自身使用和理解以及掌握的知识 ...
- 一道变态的js题
一道腾讯js面试题 题目如下: f = function() {return true;}; g = function() {return false;}; (function() { if (g() ...
- Python多进程并发(multiprocessing)用法实例详解
http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...
- linux下用script和scriptreplay对命令行操作录像
以前查看自己的历史操作,都是history里来查看的,只有命令,有时候系统返回的什么也没有,看了script可以对自己的操作进行录像,于是自己也做个. 要记录操作之前输入命令: [root@wulao ...
- JQuery中的mouseover和mouseenter的区别
mouseover和mouseout是一对:mouseenter和mouseleave是一对. 相同点:都是鼠标经过就触发事件 不同点: 给外盒子一个经过触发事件,但是mouseover会在鼠标经过外 ...
- The 2014 ACMICPC Asia Regional Xian Online
[A]签到题 [B]后缀数组 [C]染色,DP(感觉可出) [D]BFS搜索,有点麻烦 [E]博弈论,Nim博弈 [F]BFS状态搜索 [G]概率DP+状态压缩 [H]异或+构造 [I]矩阵快速幂(队 ...
- (中等) CF 311B Cats Transport,斜率优化DP。
Zxr960115 is owner of a large farm. He feeds m cute cats and employs p feeders. There's a straight r ...
- Is it possible to run native sql with entity framework?
For .NET Framework version 4 and above: use ObjectContext.ExecuteStoreCommand() if your query return ...
- iOS之Nib和Xib以及storyboard(故事版)
本文转发至:http://blog.csdn.net/tonny_guan/article/details/8542789 nib.xib与故事板 如果大家使用过苹果的官方资料,一定会发现某些资料上会 ...
- iOS学习笔记1--在xcode6以上的版本中不使用storyboard以及部分控件使用
首先建立一个iOS新工程,删除工程自动建立的main.storyboard以及xib文件,并且在info.plist上删除这两个选项 然后在项目配置中将maninterface设置为空,将launch ...