c++对象模型和对象内存布局
简单对象模型:如下图所示:

每一个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++对象模型和对象内存布局的更多相关文章
- 【转载】图说C++对象模型:对象内存布局详解
原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...
- 图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...
- 好文章系列C/C++——图说C++对象模型:对象内存布局详解
注:收藏好文章,得出自己的笔记,以查漏补缺! ------>原文链接:http://blog.jobbole.com/101583/ 前言 本文可加深对C++对象的内存布局.虚表指针.虚 ...
- c++ 对象内存布局详解
今天看了的,感觉需要了解对象内存的问题.参考:http://blog.jobbole.com/101583/ 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个 ...
- C++对象内存布局测试总结
C++对象内存布局测试总结 http://hi.baidu.com/����/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数.虚拟继承的理解.可能 ...
- c++对象内存布局
这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的st ...
- c++对象内存布局的理解
我对c++对象内存布局的理解 引言 结合网上的一些资料,通过自己的一番摸索,得出了一点个人见解.现在写下来,希望与各位同学共同探讨,共同进步. 以下所有代码均是在VS2012下测试. 一个普通的基 ...
- 使用sos查看.NET对象内存布局
前面我们图解了.NET里各种对象的内存布局,我们再来从调试器和clr源码的角度来看一下对象的内存布局.我写了一个测试程序来加深对.net对象内存布局的了解: using System; using S ...
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局. 一.多重继承 先看几个类的定义: 01 ...
随机推荐
- 聊聊、Nginx 初始化错误信息
这篇文章我们继续学习 main 方法,我们先来看看 ngx_debug_init() 这个方法. 从方法名我们也知道,debug初始化.我们先看看方法位置在哪.我们来断点在这个方法上面. Functi ...
- 【bzoj2400】Spoj 839 Optimal Marks 网络流最小割
题目描述 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其余的点的值由你 ...
- 【Luogu】P2634聪聪可可(树形DP)
题目链接 水题,时限放得非常宽,暴力DP随便套上一波register就能卡过去. 唯一的遗憾是5A. 树形DP,s[i][j]表示以i为根的子树里距i的距离%3=j的点数,f[i]表示i为根的子树内一 ...
- HDU——2064汉诺塔III
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- bzoj4717 改装 模拟+二分
Description [题目背景] 小Q最近喜欢上了一款游戏,名为<舰队connection>,在游戏中,小Q指挥强大的舰队南征北战,从而成为了一名dalao.在游戏中,不仅船只能力很重 ...
- linux安装websocketd服务
1.下载 wget https://github.com/joewalnes/websocketd/releases/download/v0.3.0/websocketd-0.3.0-linux_am ...
- 关于vue属性绑定的问题
<el-submenu index="></el-submenu> 类似于这样的形式,这里的index是以string的数据格式存在的. <el-submenu ...
- 谷歌Chrome 27测试版已经发布 更快的浏览速度
谷歌已经发布了Chrome 27测试版浏览器,为普通用户带来了大约提升为5%的网页浏览速度.用户已经可以在Chrome测试网页下载到最新的更新了.我们已经对这版更新做了一个全面的快速测试,让我们看看究 ...
- 2017.8.2 Noip2018模拟测试赛(十八)
日期: 八月二日 总分: 300分 难度: 提高 ~ 省选 得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...
- 下拉菜单的option的value属性值问题
下拉菜单的所有option都必须有value值,如果没有value会将标签中间的值传上去: 比如: <span class="el_spans">试卷级别:</s ...