简单对象模型:如下图所示:

每一个object是一系列的slots,每一个data member或者function member都有自己的一个slot。这种模型的空间和执行效率都很低。在这个模型中,members本身并不放在object之中。只有指向member的指针才放在object内。

表格驱动模型:

对象成员变量和成员变量函数各自放在一个表中,对象中有两个指针分别指向这两个表(这种模型是支持virtual  functions 的实现方式的)

c++对象模型:

1. nonstatic data memger 放置在每个class object中

2. static data members放在class object之外

3. static 与 nonstatic function members被放在class objects之外的地方

4. virtual functions 以两个步骤支持:

class 产生指向virtural functions的指针,放在表格中,这个表格成为virtural table。每个对象安插一个指针,指向相关的virtual table,成为vptr。vptr的设定和重置由constructor, destructor, copy assignment完成。

type_info object (它是支持RTTI的)也是由tirtural table指出,位于表格的第一个slot中(所以在virtual  table中不光只有虚函数的地址)

c++对象模型布局:

1.如果没有虚函数,没有成员变量,没有普通成员函数,类定义的大小为1(用sizeof()得到),而不是0。

原因:这一个字节是编译器为了指示改类的存在而设置的。如果累中有了虚函数或者成员变量,则不需要该填充字节。

2.如果单纯的设置虚函数,类的大小就会变成四个字节。因为对象模型中仅仅包含了指向virual table的vptr,此时不需要那一个自己的填充字节。如果这个字节是nostatic memeber,那么这个类对象的大小就会变成5。

3. 同理如果仅仅有一个int型的成员变量age,此时类对象的大小也是4个字节.

4. 如果成员变量age和虚函数都存在则此时的类对象的大小为8个字节,也即int型age占有四个字节, vptr指针占有四个字节

5. 如果是两个纯虚函数,此时的类对象大小仍然是 4个字节

6. 普通成员函数,其并不位于类对象之中,它位于类内存之中,并不占用类对象的内存。

c++对象模型和对象内存布局的更多相关文章

  1. 【转载】图说C++对象模型:对象内存布局详解

    原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...

  2. 图说C++对象模型:对象内存布局详解

    0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...

  3. 好文章系列C/C++——图说C++对象模型:对象内存布局详解

    注:收藏好文章,得出自己的笔记,以查漏补缺!     ------>原文链接:http://blog.jobbole.com/101583/ 前言 本文可加深对C++对象的内存布局.虚表指针.虚 ...

  4. c++ 对象内存布局详解

    今天看了的,感觉需要了解对象内存的问题.参考:http://blog.jobbole.com/101583/ 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个 ...

  5. C++对象内存布局测试总结

    C++对象内存布局测试总结 http://hi.baidu.com/����/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数.虚拟继承的理解.可能 ...

  6. c++对象内存布局

    这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的st ...

  7. c++对象内存布局的理解

    我对c++对象内存布局的理解   引言 结合网上的一些资料,通过自己的一番摸索,得出了一点个人见解.现在写下来,希望与各位同学共同探讨,共同进步. 以下所有代码均是在VS2012下测试. 一个普通的基 ...

  8. 使用sos查看.NET对象内存布局

    前面我们图解了.NET里各种对象的内存布局,我们再来从调试器和clr源码的角度来看一下对象的内存布局.我写了一个测试程序来加深对.net对象内存布局的了解: using System; using S ...

  9. 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局

    继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局. 一.多重继承 先看几个类的定义: 01 ...

随机推荐

  1. Educational Codeforces Round 36 (Rated for Div. 2)

    A. Garden time limit per test 1 second memory limit per test 256 megabytes input standard input outp ...

  2. C#委托实现异步

    BeginInvoke  开始调用 EndInvoke  结束调用 文章:C#编程总结(六)异步编程 文章:C#多线程实现方法——异步委托/调用 文章:你可能不知道的陷阱:C#委托和事件的困惑 一些委 ...

  3. js原型链继承的傻瓜式详解

    本文争取用最简单的语言来讲解原型链继承的OOP原理 0.如果对原型继承还没有大致了解,完全一头雾水,请先阅读 <JavaScript高级程序设计>第六章最后部分的寄生组合式继承 或者_廖雪 ...

  4. 利用ajax实现数据传输

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服 ...

  5. JAVA接口与抽象类区别

    接口 1.接口可以继承多个接口,extends 接口1,接口2,接口3 2.接口的成员变量默认是public static abstract,必须初始化的: 3.接口只能有抽象方法,继承接口的类必须实 ...

  6. window maven安装(六)

    Maven 实战系列之在Windows上安装Maven Maven是一个优秀的构建工具(类似于 Ant, 但比 Ant 更加方便使用),能帮助我们自动化构建过程,从清理.编译.测试到生成报告,再到打包 ...

  7. poj 1637 混合图欧拉回路 学习笔记

    题目大意 求混合图是否存在欧拉回路 做法 有向边我们只有增加入度出度 对于无向边,我们给它设定一个初始方向 如果不能满足|入度-出度|为偶数,无解 然后在网络流图中, 设设定方向的反向连一条边,表示反 ...

  8. 【CF721C】Journey(拓扑排序,最短路,DP)

    题意:给一个无环的图,问用不超过T的时间从1到n最多可以经过多少个点.要求输出一条路径. 思路:因为无环,可以用DP做.不过因为时间最短的原因要拓扑排序后再DP,目测由底向上的更新也是可以的. ; . ...

  9. DOM节点太多导致页面卡顿的优化方法

    http://developer.51cto.com/art/201504/473422.htm

  10. js对象定义的最常用的三种方法

    定义对象:属性和方法的结合体(变量和函数的结合体) 1.(***)var obj = {} 2.var obj = new Object(); 3.使用function定义对象 具体例子分别为: // ...