深度探索 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. xcode怎么打flutter的release包啊_“打工人”梗刚刚爆红网络,“早安打工人”等已被注册商标...
  2. MATLAB实现偏最小二乘回归PLS
  3. 你以为的BUG--BFC给你解决!
  4. STL源码剖析---STL容器特征总结(含迭代器失效)
  5. mysql查询很慢优化方法1
  6. Python2和Python3正则匹配中文时的编码问题
  7. MFC dialog 间 交互[2]
  8. 【iOS】Swift3中NSFetchRequest报错:Generic parameter 'ResultType' could not be inferred
  9. 开发一个手游需要的工种
  10. webpack路径问题总结
  11. Python编程PTA题解——输出星期名缩写
  12. 范式通俗理解:1NF、2NF、3NF和BNCF
  13. vue脚手架安装很慢_vue-cli3脚手架安装
  14. LeetCode | 521. Longest Uncommon Subsequence I
  15. yii mysql 查询 类型转换_yii2.0数据库查询修改等方法
  16. 贪心算法求解:王者荣耀购买点券最优策略
  17. android+仿友盟更新,android友盟增量更新
  18. 链表OJ题---Java实现
  19. 分享一个MongoDB可视化工具rockmongo-on-windows
  20. PHP简洁小猫咪图床源码 带12个图床接口

热门文章

  1. 对WOW服务端模拟器的思考
  2. keil Software pack离线下载方法
  3. LeetCode 1306. 跳跃游戏 III
  4. amd r7 2700u linux,AMD锐龙7 2700U四核八线程性能到底有多强悍?实测揭晓
  5. scrapy-redis案例(三)爬取中国红娘相亲网站
  6. ftp自动上传或下载脚本
  7. KuPlay:破解游戏寒冬“三荒”指南
  8. 安卓开发学习之002 LinearLayout之android:layout_gravity详解
  9. TiDB数据库概述——PD
  10. 公司取好名字的方法妙招