深度探索 C++ 对象模型
读书笔记之一  C++对象布局

读完了这本书,要是不做一些笔记、总结一下,是怎么也说不过去的。这本书个我们从头至尾详细的解释了C++对象模型如何为我们服务,是的了解了就是服务,不了解或许就是抱怨^_^。从构造函数语义到Data语义,再到函数语义,再到执行期语义,由浅入深(从单一继承到多态,到多重继承,再到虚拟继承)详细的讲解了C++是如何做到的。这里就不多废话了,想跟多了结这本书大概内容的可以参考这里,或者到作者的BLOG去溜溜。

我们从最基本的对象谈起吧,原谅我还不能一下指出其精髓~.~,C语言中形如

typedef struct point3d {

    float x;

    float y;

    float z;

} Point3d;

这样的结构体,与C++中的

class Point3D {

    float x, y ,z;

public:

    Point3D(float x_, float y_, float z_)

        : x(x_), y(y_), z(z_){}

};

或者甚至是经由 Point –> Point2D –> Point3D 这样派生而来的对象有差别吗?

打开你的编译器,看看 sizeof(Point3D) 是不是12呢?不是的话果断丢掉你那编译器,并去跟Bjarne抱怨C++怎么会这样呢?C++中的对象布局到底如何呢?其实对于Point3D来说,其每一个对象实例所拥有的也就是那三个float而已,也不会带来任何执行期的不良回应。
C++布局和时间上的额外负担来源于 概括起来其实书上总结的两点:
virtual function 机制  用以有效率的执行期绑定
virtual base class 用以实现“多次出现在继承体系结构中的base class,有一个单一的被共享的实体”。

那么C++中究竟是怎么布局的呢?考虑Point3D对象,成员x y z按照声明的先后次数存储,静态或非静态成员函数都只有单一的实体,放在对象的外面,一个特别的情况是类里什么也没有的时候,编译器会放一个byte的数据就去,防止两个对象地址相同的情况。对与继承的情况

class Vetex2D : public Point3D {

    Vetex2D *next;

}

Vetex2D里依次存储了 x, y , z, *next; 如果Point3D有一个虚函数

virtual void printcoo(ostream& os){

    os << x << " " << y << " " << z << " " << endl;

}

则Point3D的构造函数将负责产生其虚函数表vtbl,同时Point3D中将有一个指向vtbl的指针vptr,在VS中,MS的做法是把vptr放在对象的起始处,而以前的做法是放在对象的尾端,其实标准并没有规定要放在哪里,由编译器厂商厂商决定。简单来说,放在尾部可以与C的struct兼容,而放在首部可以提高效率。对于vtbl,一般第一个slot存放了类的类型,用作RTTI(runtime type identification)。

对于虚拟继承的情况稍显复杂,考虑如下的继承关系

 
ostream中有一个ios,为了保证让ios成为可共享的,ostream不能修改ios的vtbl,所以其会有一个自己的vptr,同时还得有一个指向virtual base class 的指针bptr,对istream一样,对于iostream而言,其大小将为 sizeof(ostream) + sizeof(istream) + 自己的成员 - sizeof(ios)。对于多重继承的情况而言,比如说某类A从N类继承而来,A类会为此多付出N-1个指针的开销,如果基类都有虚函数的话。对于单一继承而言派生类只需要更改其基类的虚函数表就够了,但是多重继承下每个基类的vptr保留下来。其实也挺清楚的,基本上就是这样的了。

Inside The C++ Object Model 读书笔记相关推荐

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

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  2. Inside the C++ Object Model | Outline

    <Inside the C++ Object Model(C++对象模型)>,这是一本灰常不错的书! CSDN下载页面(中文,侯捷译) 豆瓣评论 读书笔记目录如下(不定时更新): 转载于: ...

  3. inside the C++ Object model总结

    一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...

  4. More Effective C++读书笔记

    0 导读 鼓励在至少两种编译器平台上发展代码(有哪些编译器??) 1 基础议题 条款1:仔细区别pointers和references 如果这个变量总是必须代表一个对象,也就是说如果你的设计并不允许这 ...

  5. [读书笔记] 从问题和公式角度理解 Diffusion Model

    [小全读书笔记] 从问题和公式角度理解 Diffusion Model 1. Diffusion Model的结构 1.1 定义与限制 1.2 定义与限制的数学体现 2. Diffusion Mode ...

  6. Sharepoint学习笔记 –架构系列—Sharepoint的客户端对象模型(Client Object Model)

    前面过了一下Sharepoint的服务器端对象模型,接下来就让我们大致看看Sharepoint的客户端对象模型(Client Object Model: Client OM). 首先需要了解的就是Sh ...

  7. Sharepoint学习笔记 –架构系列—12 Sharepoint的客户端对象模型(Client Object Model)

    前面过了一下Sharepoint的服务器端对象模型,接下来就让我们大致看看Sharepoint的客户端对象模型(Client Object Model: Client OM). 首先需要了解的就是Sh ...

  8. Sharepoint学习笔记 –架构系列—10 Sharepoint的服务器端对象模型(Server Object Model) 2.内容层次结构

    Sharepoint的内容层次结构(Content Hierarchy)包括表示可发布数据项(publishable items),如列表项的类,还包括表示嵌套的数据容器(nested contain ...

  9. Qt文档阅读笔记-Object Model

    Object Model 标准C++对象模型提供了非常有效的运行时的对象范例.但是他的静态属性在某些领域是不灵活的.图形用户界面的编程领域需要运行时的效率和高等级的灵活.Qt提供了这样能力,通过C++ ...

最新文章

  1. MSSQL-最佳实践-行级别安全解决方案
  2. Java技术体系平台
  3. Operations on Numbers Strings
  4. WebForm页面使用Ajax
  5. 炼丹面试官的面试笔记
  6. java 类 属性数量_跟我学java编程—Java类的属性与成员变量
  7. zk pivottable java_zookeeper节点类型和java客户端创建zk节点
  8. 如何使用 Secret?- 每天5分钟玩转 Docker 容器技术(108)
  9. ITxlab倡议启动“互联网X大脑”计划
  10. python3GUI--刷屏器(附源码)
  11. 记忆减退之---钽电容
  12. qq企业邮箱怎么删除邮件服务器,腾讯企业邮箱删除邮件方法
  13. java 验证18位身份证号是否合法
  14. 《 种子用户方法论》读书笔记
  15. php面试你离职的原因,如何在面试中描述你的离职原因?
  16. 【引用】DMA内存申请--dma_alloc_coherent
  17. 第十四章 齐桓公广开门路招贤才 卫宁戚饭牛而歌得重用
  18. 视频教程-系统集成项目管理工程师考试-项目管理部分大全-软考
  19. python中导入numpy库_python中的Numpy库
  20. 由热力学到信息学-熵—信息熵

热门文章

  1. 惠普HP Deskjet F2188 多功能一体机驱动
  2. “植物的生殖”知识总结
  3. 病毒(2)CPU烤肉(C++)
  4. JS保留小数点后有效数字两位
  5. 华为鸿蒙麒麟荣耀,华为鸿蒙系统升级标准爆料:需麒麟 710 以上机型,华为与荣耀皆可...
  6. 基于mysql的胖客户端_胖客户端与瘦客户端
  7. JavaScript基础使用
  8. 观看慕课老师milanlover视频Tomcat装在Servlet的三种情况+Servlet获取表单数据+Servlet相对路径
  9. 计算机转行学汽修,作为一个刚入行的汽修学徒给你们的忠告
  10. 开发小程序要学JavaScript?