当前位置: 首页 > news >正文

未央免费做网站提供邯郸网站建设

未央免费做网站,提供邯郸网站建设,政协门户网站建设方案,网站开发培训 价格一直想搞清楚类对象的数据成员和虚函数的内存布局&#xff0c;今天刚好有时间&#xff0c;所以就写了个demo查看了一下具体的内存布局情况&#xff08;使用的编译器为微软的&#xff09;。下面是自己demo的代码&#xff1a;#include <iostream> #include <windows.h&g…

一直想搞清楚类对象的数据成员和虚函数的内存布局,今天刚好有时间,所以就写了个demo查看了一下具体的内存布局情况(使用的编译器为微软的)。

下面是自己demo的代码:

#include <iostream>
#include <windows.h>//#pragma pack(4)  //影响每个类对象对齐的字节数,默认对齐到8字节
class A
{
public:virtual void Test1() {};int a;
};class B
{
public:virtual void Test2() {};int b;
};class C :public A, public B {
public:virtual void Test1() override{}virtual void Test2() override{}virtual void Test3() {};int c;
};void main()
{C *pC = new C();pC->a = 1;pC->b = 2;pC->c = 3;int size = sizeof(*pC);int sizeA = sizeof(A);int sizeC = sizeof(C);A* pA = pC;B* pB = pC;int sizeA1 = sizeof(*pA);bool bRet = (pB == pC);
}
  • 下面是代码执行的时候内存布局截图:

从截图可以得到以下结果:

  1. 派生类对象C首先包含了基类A对象的数据,然后包含基类B对象的数据,最后才是包含自己的数据成员。

  1. 派生类C中包含了2个虚表,一个虚表是指向基类A中的函数,一个虚表是指向基类B中的函数。类C有2个虚表是因为它派生自两个基类。如果是单继承就只有一个虚表。

还有一个知识点无法从图中得知:如果派生类中包含自己的虚函数,则这个函数会添加到第一个虚表的尾部。

  • 下面是代码执行的时候对象占用内存大小截图:

类A对象会占用的内存大小为16字节:虚表指针8个字节+数据成员a占用4个字节,此时只有12个字节,但是微软编译器默认是对齐到8字节的,所以最终加上字节对齐,整个类A对象占用的内存大小为16字节。

类C对象占用的内存大小为40字节:类A的部分占用16字节+类B的部分占用16字节+数据成员c占用4个字节,此时只有36个字节,根据字节对齐默认为8字节,所以最终加上字节对齐,整个类C占用的内存大小为40字节。

如果将前面代码中的第四行代码“//#pragma pack(4)”的注释去掉(将编译器字节对齐强制设为4字节),此时各个类对象的内存占用大小会发生变化。具体如下:

类A对象会只占用12字节(虚表指针8个字节+数据成员a占用4字节,刚好对齐到4字节),类C对象会占用28字节(类A对象12字节+类B对象12字节+数据成员C占用4字节,刚好对齐到4字节)

对齐到4字节的内存占用大小截图:

  • 下面是将pC(类C对象的地址)赋值给pA(类A指针)和pB(类B指针)以后,pC,pA,pB具体值的截图:

从截图可知:

  1. pA的值和pC的值相等:这是因为类C的继承关系中,类A是第一个基类,所以在类C对象的内存布局中,首先就是类A所占用的部分。

  1. pB的值-pC的值=12字节:这是因为类C的继承关系中,类A是第一个基类,类B是第二个基类,所以在类C对象的内存布局中,类B放在类A的后面,只要把pC的地址加上类A占用的部分(12字节,对齐到4字节)就是pB的地址。

根据上面的结果,我们知道pB和pC虽然指向同一个对象,但是他们的地址值不一样,如果用pB和pC比较会返回true还是false呢?下面是运行截图:

我们发现最终的比较结果为true,这个是因为编译器在比较两个指针的时候,不是简单的对两个地址值进行比较,如果发现两个指针所属的类有继承关系的时候,会先进行转换,然后再比较。

http://www.yayakq.cn/news/920167/

相关文章:

  • 连云港市城乡建设局网站手机网站标准字体大小
  • 小型IT网站开发公司怎么建设网站卖东西
  • 平面设计网站有什么东莞做网站的公司有哪些
  • 北京网站设计网站设计公司wordpress动态背景插件
  • 营销网站建设专业公司在西部数码做的企业网站不能与阿里巴巴网站相连接
  • 购买网站做网页游戏wordpress 如何修改关于我们
  • 海曙网站制作wordpress位置
  • 高校学生红色网站建设新手小白怎么做跨境电商
  • 网站子站怎么做安徽平台网站建设设计
  • 坪山网站建设设计做口腔科网站
  • 网站建设效果北京中联建设集团官网网站
  • 成都诗和远方网站建设个人电脑建网站
  • 中国建设法律法规网官方网站建设网站的公司有哪些知乎
  • 免费建单页网站小网站推荐一个
  • 洛阳哪里做网站建一个网站需要什么流程
  • 潍坊网站排名优化建站公司前途
  • 高端网站建设公司推荐wordpress主题 问答
  • 怎么向google提交网站wordpress下载功能
  • 保定做网站多钱wordpress审计
  • 邢台企业做网站哪家好重庆发布的最新消息今天
  • 什么网站可以做时间加减品物设计集团
  • 商标设计app舟山seo
  • 海宁营销型网站建设价格dw怎么做网站后台
  • 可信网站认证 费用免费广告设计素材
  • 佛山外贸网站建设流程成都网站制作软件
  • 营销网站价格我的家乡网页设计报告
  • 视频网站建设需要多少钱企业网站里面的qq咨询怎么做
  • 图片网站模版利用python做网站
  • 自己建网站卖东西怎么样扬中网站建设流程
  • 厦门专业网站设计工作方案的格式及范文