0.菜鸟觉得,在看这本书的时候最好切换角色,把自己的思维转换成编译器开发者,去考虑问题,这样会容易理解些.(当然这样很难,就想着自己要解决什么样的问题好了)

1.在C++中,类的数据成员有两种:静态和非静态;成员函数有三种:静态,非静态 ,虚函数。(之所以这样分,大概是因为在设计c++对象模型时,非静态的数据成员表现出来的问题属于同一类)。

2.对象模型的发展

2.1简单对象模型

这个模型中一个类对象就像是一维指针类型数组,按照类成员的声明顺序依次指向在该成员在内存中的虚拟地址。

2.2表格驱动模型

这种模型把所有的成员信息抽出来,放在一个数据成员表和一个成员函数表之中,类对象本身则含指向这个两个表格的指针。

2.3C++对象模型

这种模型中,非静态数据成员被配置于每一个类对象之内,静态数据成员则被放在所有类对象之外,静态和非静态成员函数也被放在所有的类对象之外,对于虚函数则通过以下两个步骤来支持:

1.每一个类产生出一堆指向虚函数的指针,放在表格中,即虚函数表(vtbl).

2.每一个类对象被添加了一个指针,指向相关的虚函数表,这个指针被叫做vptr.vptr的设定和重置都由每一个类的构造函数,析构函数,赋值运算符自动完成(具体实现后面再讲)。每一个类所关联的type info object(用来支持RTTI运行时类型识别)也经由虚函数表指出来,通常是放在表格的第一行。

2.4加上继承后的对象模型

C++支持单一继承,和多重继承,多重继承就会引发同基类二义性问题,这个时候应采用虚基类 virtual继承方式.

base table(基类表)模型

1、基类表被产生出来时,表格中的每一个slot(行)内含一个相关的基类地址,这点类似于虚函数表内含每一个虚函数地址一样。

2、每一个类对象内含一个指向基类的指针bptr,它会被初始化,指向其基类表

这种模型的缺点在于由于间接性而导致的空间和存取时间上的额外负担,优点在于每一个类对象中对于继承都有一致的表现形式:每个类对象都应该在某个固定位置上安放一个基类指针,于基类的大小或数目无关

版权声明:本文为博主原创文章,未经博主允许不得转载。

深度探索C++对象模型之C++对象模型笔记的更多相关文章

  1. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

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

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  3. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  4. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  5. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  6. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  7. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  8. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  9. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  10. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

随机推荐

  1. [学习笔记]agileone安装登陆报错,localhost重定向次数过多

    1.找到.htaccess文件 2.修改RewriteEngine  参数为off即可

  2. java读写锁源码分析(ReentrantReadWriteLock)

    读锁的调用,最终委派给其内部类 Sync extends AbstractQueuedSynchronizer /** * 获取读锁,如果写锁不是由其他线程持有,则获取并立即返回: * 如果写锁被其他 ...

  3. 常用的html标签大全

    html标签大全 一.文字 1.标题文字 <h#>..........</h#> #=1~6:h1为最大字,h6为最小字 2.字体变化 <font>........ ...

  4. MVC之联动学习

    一,数据库表设计 CREATE TABLE [dbo].[HY_Province]( [id] [INT] NOT NULL, [province] [NVARCHAR]() NOT NULL, CO ...

  5. jsp:useBean的使用

    ->Bean的基本要素: 1.必须要有一个不带参数的构造器,在jsp元素创建Bean时会调用空构造器 2.Bean类应该没有任何公共实例变量,也就是说,不允许直接访问实例变量,通过setter/ ...

  6. 【XML】document.createEvent的使用方法

    <aclass="comment-mod"onclick="alert('ss')"href="#">评论</a> ...

  7. C# 语言规范_版本5.0 (第6章 转换)

    1. 转换 转换(conversion) 使表达式可以被视为一种特定类型.转换可导致将给定类型的表达式视为具有不同的类型,或其可导致没有类型的表达式获得一种类型.转换可以是隐式的 (implicit) ...

  8. [阿当视频]WEB组件学习笔记

    — 视频看完了,自定义事件还不懂,等完全懂了再更新并完成整篇案例 1. JS分层和组件的种类浏览器底层包括HTML CSS JS(DOM/BOM/Style/Canvas 2D/WebGl/SVG) ...

  9. React添加自定义属性

    使用‘data-’前缀即可,代码举例 render(){ return ( <ul className={css.forUl}> { this.props.todo.map(functio ...

  10. hibernate异常:org.hibernate.NonUniqueObjectException

    异常:org.hibernate.NonUniqueObjectException 提示:a different object with the same identifier value was a ...