1.0

C++的编程范式一共有三种,分为程序模型(procedural model)、抽象数据类型模型(abstract data type model, ADT)和面向对象模型(object-oriented model)。这三种范式不止在程序风格上有显著的不同,在程序的思考上也有明显的差异。
在C++中加上封装后的布局成本:与C struct相比并没有增加成本。在C++中,布局及存取时间上的主要额外负担来自virtual引起的,包括:- virtual function机制 用以支持一个有效率的“执行期绑定”- virtual base class 用以实现“多次出现在继承体系中的base class,有一个单一而被共享的实例”

1.1 C++对象模型

在C++中,有两种class data member: static 和 nonstatic, 以及三种class member function: static、nonstaic 和 virtual。
在Stroustrup当初设计的模型中,Nonstatic data member 被配置于每一个class object之内,static data member 则被存放在个别class object 之外。static 和 nonstatic function member 也被放在个别的class object 之外。Virtual function 则以两个步骤支持之:1. 每个 class 产生一堆指向 virtual function 的指针,放在表格中。这个表格被称为 virtual table(vtbl)。2.  每个class object被安插一个指针,指向相关的 virtual table。通常这个指针被称为 vptr。vptr 的设定和重置都由每一个 class 的 constructor、destructor 和 copy assignment运算符自动完成(在第五章详细讨论)。每一个 class 所关联的 type_info object 也经由 virtual table 被指出,通常放在表格的第一个slot。

继承模型

C++最初的继承模型:base class subobject 的 data member 被直接放置于 derived class object 中。这提供了对 base class members 最紧凑而且最有效的存取。但是,base class member 的任何改变,使得所有用到“此base class 或者其 derived class 之 object”者都必须重新编译。
对于 virtual base object,需要一些间接的 base class 表现方法(我们在第三章详细讨论)。

对象模型如何影响程序

举个栗子,看下面函数,其中class X定义了一个 copy constructor、一个virtual destructor 和一个 virtual function foo:
X foobar()
{X xx;X *px = new X;//foo 是一个 virtual functionxx.foo();px->foo();delete px;return xx;
}

这个函数有可能被转化为:

//可能的内部转换结果
//虚拟C++代码
void foobar(X &_result)
{//构造 _result// _result 用来取代 local xx..._result.X::X();//扩展X *px = new X;px = _new( sizeof(X) );if( px != 0 )px->X::X();//扩展 xx.foo() 但不使用virtualfoo( &_result );//使用 virtual 机制扩展 px->foo();( *px->vtbl[2] )( px );//扩展 delete px( *px->vtbl[1] )( px );_delete( px );//无须使用 named return statement//无须摧毁 local object xxreturn;
}

对象的差异

C++以下列方法支持多态:

  • 经由一组隐式的转化操作。例如把一个 derived class 指针转化为一个指向其 public base type 的指针:
    shape *ps = new circle();
  • 经由 virtual function 机制
  • 经由 dynamic_cast 和 typeid 运算符

    需要多少内存才能表示一个 class 呢?一般而言需要:

  • 其 nonstatic data members 的总和大小

  • 加上任何由于 alignment 的需求而填补上去的空间
  • 加上为了支持 virtual 而由内部产生的任何额外负担

指针的类型
指向不同类型的指针,它们之间有什么区别?
以内存需求角度来说,并没有什么不同,都是要有足够的内存来放置一个机器地址(通常是一个word)。
区别在于,涵盖的地址大小不同。例如有:

int a;  //假设a的地址为 1000
double b; //假设b的地址为 2000
int *pInt = &a; //pInt:1000
double *pDouble = &b; //pDouble:2000
++pInt; //pInt: 1004
++pDouble; //pDouble: 2008
可以看到,pInt的涵盖的内容大小是一个sizeof(int) = 4,pDouble涵盖的大小是一个sizeof(double)。

《深入探索C++对象模型》笔记之第一章关于对象相关推荐

  1. [读书笔记] - 《深度探索C++对象模型》第1章 关于对象

    1.C++在布局以及存取时间上主要的额外负担是由virtual引起,包括: 1>virtual function机制:用以支持一个有效率的"执行期绑定"(runtime bi ...

  2. 《Oracle DBA工作笔记》第一章

    <Oracle DBA工作笔记>第一章 BLOG文档结构图I 本文简介 建荣的新书<Oracle DBA工作笔记>拿到手了,下午离下班还有1个小时的时候有空了,就阅读了下新书的 ...

  3. 数字图像识别笔记(第一章绪论)

    title: 数字图像识别笔记(第一章绪论) categories: 数字图像识别 tags: 数字图像识别 date: 2020/9/29 23:59 mathjax: true toc: true ...

  4. 学习笔记-应用光学 第一章 几何光学的基本定律

    学习笔记-应用光学 第一章 几何光学的基本定律 1-1 发光点.波面.光线和光束 发光点:本身发光或被照明后发光的几何点 波面:发光点在某一时刻发出的光形成波面 (在各向同性均匀介质中波面是球形) 光 ...

  5. oracle小麦苗博客,《Oracle DBA工作笔记》第一章

    <Oracle DBA工作笔记>第一章 1BLOG文档结构图 2本文简介 建荣的新书<Oracle DBA工作笔记>拿到手了,下午离下班还有1个小时的时候有空了,就阅读了下新书 ...

  6. 001.宋浩老师《线性代数》笔记(第一章行列式)

    宋浩老师<线性代数>笔记(第一章行列式) 目录 1.1 行列式 1.1.1二阶,三阶行列式和排序 1.1.2 n阶行列式 1.2 行列式的性质 1.3  行列式按行展开 1.4 行列式的计 ...

  7. PMBOK(第六版) 学习笔记 ——《第一章 引论》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

  8. 【Python学习笔记】第一章基础知识:格式化输出,转义字符,变量类型转换,算术运算符,运算符优先级和赋值运算符,逻辑运算符,世界杯案例题目,条件判断if语句,猜拳游戏与三目运算符

    Python学习笔记之[第一章]基础知识 前言: 一.格式化输出 1.基本格式: 2.练习代码: 二.转义字符 1.基本格式: 2.练习代码: 3.输出结果: 三.输入 1.基本格式: 2.练习代码: ...

  9. 马丁福勒《UML精粹》读书笔记_第一章

    马丁福勒<UML精粹>读书笔记_第一章 UML的使用场景 必须遵从UML规则吗? 在上述草图.蓝图的场景下,不必过多强调遵从UML规则.因为我们使用UML的目的是为了一个好的设计,所以应将 ...

最新文章

  1. 编写程序,输入各类型变量按相应格式输出
  2. java实现遍历树形菜单方法——service层
  3. 笔记32 | UI系列之EditText和AutoCompleteTextView
  4. js考试题 html5新特性,Web前端初级面试题总结
  5. 细说C#多线程那些事 - 线程同步和多线程优先级
  6. 解决sockjs.js?9be2:1609 GET http://192.168.1.1:8080/sockjs-node/info?t=1634257459…… 中的报错
  7. MapReduce 作业调试
  8. iar stm32_树莓派玩转STM32开发(一)——介绍篇
  9. 减治法在查找算法中的应用(JAVA)--折半查找
  10. 利用循环队列的思想进行加密解密(洛谷P1914题题解,Java语言描述)
  11. Symfony1.4.11学习笔记(三):设置虚拟机
  12. 【Java 网络编程】网络通信原理、TCP、UDP 回显服务
  13. 转发:一个复杂系统的拆分改造实践
  14. RDKit入门教程(1)——RDKit 安装 (Win10)
  15. 成果展示 | 大数据应用开发平台DWF
  16. 阿里云ACP认证之云安全知识整理(考题占比 10%)
  17. 最常见6大防采集套路及解决方法,建议收藏!
  18. js 实现筋斗云效果(点击tab栏里面的某个地方,会有图片移动到此地方)
  19. 全选、删除、撤回、剪切、复制、粘贴、永久性删除、新建文件夹、启动任务管理器、退出的快捷键
  20. 在Java中中文需要用双引号吗_Java语言支持Unicode,自然支持中文,所以Java中可以使用中文的双引号、单引号、分号代替英文的双引号、单引号、分号。...

热门文章

  1. eclipse没有java web,Eclipse Juno在Dynamic Web Project中没有JSP(但其他一切都很好)
  2. ImportError: libclntsh.so.11.1: cannot open shared object file: No such file or directory解决方案
  3. opengl画的弧线 为什么有一个半径_怪兽怎么画?简笔画怪兽教程来啦!跟孩子一起学习画萌萌的怪兽吧...
  4. B1.Java基础部分一
  5. Java学习笔记2.5.2 循环结构 - 计数循环
  6. Spark基础学习笔记06:搭建Spark On YARN模式的集群
  7. 安卓学习笔记33:实现逐帧动画
  8. Python数据分析学习笔记03:NumPy基础(数组与向量化计算)
  9. MyBatis框架笔记03:MyBatis实现CRUD
  10. 写给省选前的自己V2