C++对象内存布局 (一)
一、前言
在看了皓哥的C++对象的布局之后:http://blog.csdn.net/haoel/article/details/3081328。感觉自己还是总是不能记得很清楚,故在此总结一下C++对象的内存布局,一遍以后及时复习。
二、
- 单一非虚继承:有成员变量,有虚函数和虚函数的覆盖,不是虚拟继承

源码如下:
#include <iostream>
using namespace std; class Parent
{
public:
int iparent;
Parent() : iparent() {}
virtual void f()
{
cout << "Parent::f()" << endl;
}
virtual void g()
{
cout << "Parent::g()" << endl;
}
virtual void h()
{
cout << "Parent::g()" << endl;
}
}; class Child : public Parent
{
public:
int ichild;
Child() : ichild() {}
virtual void f()
{
cout << "Child::f()" << endl;
}
virtual void g_child()
{
cout << "Child::g_child()" << endl;
}
virtual void h_child()
{
cout << "Child::h_child()" << endl;
}
}; class GrandChild : public Child
{
public:
int igrandchild;
GrandChild() : igrandchild() {};
virtual void f()
{
cout << "GrandChild::f()" << endl;
}
virtual void g_child()
{
cout << "GrandChild::g_child()" << endl;
}
virtual void h_gradnchild()
{
cout << "GrandChild::h_grandchild()" << endl;
}
};
int main(int argc, char **argv)
{
GrandChild gc;
typedef void(*Fun)(void);
Fun pf; cout << "[0] GrandChild::vfptr->" << endl;
cout << " [0]";
pf = (Fun)*(int *)*(int *)&gc;
pf(); cout << " [1]";
pf = (Fun)*((int *)*(int *)&gc + );
pf(); cout << " [2]";
pf = (Fun)*((int *)*(int *)&gc + );
pf(); cout << " [3]";
pf = (Fun)*((int *)*(int *)&gc + );
pf(); cout << " [4]";
pf = (Fun)*((int *)*(int *)&gc + );
pf(); cout << " [5]";
pf = (Fun)*((int *)*(int *)&gc + );
pf(); cout << "[1] Parent.iparent = " << (int)(*((int *)&gc + )) << endl;
cout << "[2] Child.ichild = " << (int)(*((int *)&gc + )) << endl;
cout << "[3] GrandChild.igrandchild = " << (int)(*((int *)&gc + )) << endl;
return ;
}
代码运行结果如下:
[] GrandChild::vfptr->
[]GrandChild::f()
[]Parent::g()
[]Parent::g()
[]GrandChild::g_child()
[]Child::h_child()
[]GrandChild::h_grandchild()
[] Parent.iparent =
[] Child.ichild =
[] GrandChild.igrandchild =
由此可见,在这种继承关系下,一个对象会有一个被称作虚函数表指针的vfptr。接着会存放Parent -> Child -> GrandChild。这里直接把皓哥的图片拿来用了:

可以看出:1.虚函数表指针在整个对象的最前面;
2.基类数据成员放在派生类的前面;
3.在虚函数表中派生类覆盖的函数得到了更新。
sizeof(gc) = 16 : sizeof( vfptr ) + 3 * sizeof( int )
C++对象内存布局 (一)的更多相关文章
- 图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...
- c++ 对象内存布局详解
今天看了的,感觉需要了解对象内存的问题.参考:http://blog.jobbole.com/101583/ 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个 ...
- c++对象内存布局
这篇文章我要简单地讲解下c++对象的内存布局,虽然已经有很多很好的文章,不过通过实现发现有些地方不同的编译器还是会有差别的,希望和大家交流. 在没有用到虚函数的时候,C++的对象内存布局和c语言的st ...
- c++对象内存布局的理解
我对c++对象内存布局的理解 引言 结合网上的一些资料,通过自己的一番摸索,得出了一点个人见解.现在写下来,希望与各位同学共同探讨,共同进步. 以下所有代码均是在VS2012下测试. 一个普通的基 ...
- 好文章系列C/C++——图说C++对象模型:对象内存布局详解
注:收藏好文章,得出自己的笔记,以查漏补缺! ------>原文链接:http://blog.jobbole.com/101583/ 前言 本文可加深对C++对象的内存布局.虚表指针.虚 ...
- 使用sos查看.NET对象内存布局
前面我们图解了.NET里各种对象的内存布局,我们再来从调试器和clr源码的角度来看一下对象的内存布局.我写了一个测试程序来加深对.net对象内存布局的了解: using System; using S ...
- 【转载】图说C++对象模型:对象内存布局详解
原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局. 一.多重继承 先看几个类的定义: 01 ...
- C++对象内存布局测试总结
C++对象内存布局测试总结 http://hi.baidu.com/����/blog/item/826d38ff13c32e3a5d6008e8.html 上文是半年前对虚函数.虚拟继承的理解.可能 ...
- C++对象内存布局 (二)
在上一篇文章中讨论了C++单一一般继承的对象内存布局http://www.cnblogs.com/uangyy/p/4621561.html 接下来继续讨论第二种情况: 2.单一的虚拟继承:有成员变量 ...
随机推荐
- jQuery自适应倒计时插件
jQuery自适应倒计时插件 在线演示本地下载
- PHP常用的一些函数:
背景:这一次是对一些函数进行整理,方便以后的使用. 1.date(); date()函数的作用是获取当前日期时间,由于PHP 5.0对date()函数进行了重写,因此,当前的日期时间函数比系统时间少了 ...
- java中 数组 list map之间的互转
三者之间转换关系,一张图清晰呈现. 上代码: 其中的maputils是apache的collection包. package util; import java.util.ArrayList; imp ...
- Power Designer逆向操作(从mysql5.0生成数据库的物理模型)
Power Designer逆向操作(从mysql5.0生成数据库的物理模型) 环境:powderdesigner12.5:mysql5.0 步骤: 1. 为指定的数据库配置MySQL的ODBC数据 ...
- Discuz! X3.1云平台QQ互联的Unknown column 'conuintoken' in 'field list' 解决办法
http://www.discuz.net/thread-3482497-1-1.html 由于程序安装默认数据表的结构和QQ互联数据表结构不同,安装Discuz! X3.1和升级Discuz! X3 ...
- day08-字符编码
目录 计算机基础 启动应用程序 写文本的流程 Python解释器执行文件的原理 Python解释器与文本编辑器的区别 字符编码 字符编码发生在哪三个阶段 字符编码发展史与分类 总结 Python2与P ...
- 如何创建一个项目,让gitlab自动触发jenkins进行构建
前进是:你已经配置好jenkins+gitlab自动化布置了,这里只是常规构建新的项目时,需要做的配置,记录下来,以免忘了又着急 参考这篇博客: https://www.jianshu.com/p/e ...
- 微信小程序——weui的使用
使用在根目录中复制weui.wxss,app.wxss中引入 在weui.io中查看到自己想要的样式表后,到第二个网站复制代码,复制到自己的项目中即可 <!--pages/register/re ...
- cuda_device_functions.h:32:31: fatal error: cuda/include/cuda.h: 没有那个文件或目录
问题在复现工程https://github.com/google/hdrnet时遇到. 现象: 解决办法: 修改hdrnet文件夹下的Makefile文件:在在nvcc里面添加路径:-I /usr/l ...
- fuel一键部署
1. 所需物理主机的要求如下 内存:8GB+,推荐16GB: 磁盘:50GB+: 物理机OS:ubuntu-desktop-amd64 14.04(推荐) 或windows64位 物理机安装软件:安装 ...