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

每一个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. April Fools Contest 2018

    这个比赛不正经,但是我可以一本正经的写代码啊 A. Quirky Quantifiers time limit per test 2 seconds memory limit per test 64 ...

  2. [错误处理]Vim卡死,无法输入是怎么回事?是不是按了Ctrl+S

    在linux下使用终端的时候常常不经意的就僵死了,只能够重启来解决这个问题,后来发现常常是因为按了Ctrl+s. 经过查询Ctrl + s在终端下的含义是暂停使用该终端的用途,如果需要启用终端,需要按 ...

  3. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  4. 算法复习——树形dp

    树形dp的状态转移分为两种,一种为从子节点到父节点,一种为父节点到子节点,下面主要讨论子节点到父亲节点的情况: 例题1(战略游戏): 这是一道典型的由子节点状态转移到父节点的问题,而且兄弟节点之间没有 ...

  5. css的部分应用示例

    CSS :层叠样式表,Cascading Style Sheets.CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化. 1 vertical-align 在图片与文字对 ...

  6. Idea连接服务器docker并部署代码到docker实现一键启动

    好记性不如烂笔头,写笔记是为了回头看的. 谁要是不小心搜了看了,如有不足之处敬请谅解. 一.准备工作 虚拟机centos7.X,docker1.3.X,Win10 Idea2018.1 默认Idea已 ...

  7. 我要好offer之 链表大总结

    单链表是一种递归结构,可以将单链表看作特殊的二叉树(我把它叫做一叉树) 单链表的定义: /** * Definition for singly-linked list. * struct ListNo ...

  8. 【CF1023B】Pair of Toys(解方程)

    题意:给定n个玩具要你选出两个玩具求出k的价值,第i个玩具的价值为i.若是没有选择方案,输出0 补充:玩具A与玩具B 和 玩具B和玩具A 是同一种选择 n,k<=1e14 思路:列出式子,解不等 ...

  9. angular关于依赖注入

    <html> <head> <title>Angular JS Forms</title> </head> <body> < ...

  10. 一款手机端的日历插件ICalendar.js

    我的网盘:http://pan.baidu.com/s/1jIib2Ay