当前位置: 首页 > 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.yidumall.com/news/96127.html

相关文章:

  • 盐城建设局网站哈尔滨seo公司
  • 网站js时间代码外链生成器
  • 商务网站开发实训任务书百度关键词推广怎么收费
  • 英铭网站建设seo优化顾问
  • 做app+的模板下载网站排名优化百度
  • 做网站税率seo网站推广软件排名
  • wordpress vantage主题谷歌seo网站推广
  • 做网站的资料合理使用说明
  • 网站建设 响应式 北京360优化大师下载安装
  • 临沂网站建设排名深圳seo优化服务
  • 网站建设需求分析写什么郑州seo优化顾问热狗
  • 网站图片设计兼职企业网站推广注意事项
  • 建设带数据搜索的网站免费写文案神器
  • 如何做类似于淘宝的网站浏览器大全
  • 写好网页怎么建成网站不收费推广网站有哪些
  • 武汉 外贸网站建设百度竞价平台官网
  • 黑龙江建设部网站谷歌推广一年多少钱
  • 在猪八戒找人做网站靠谱吗制作一个网站的费用是多少
  • 网站源码还可以做授权么短视频营销的优势
  • 成都网站建设制作设计网店运营培训哪里好
  • WordPress回复可见不能显示草根seo视频大全
  • 广州网站建设索王道下拉搜索引擎优化方法总结
  • 毕业设计做网站怎么做网络营销推广的概念
  • wordpress托管网站二级域名查询入口
  • 微盟属于营销型手机网站商品关键词怎么优化
  • 惠州建设集团网站信息流推广主要具有哪两大优势
  • 开网站平台需要多少钱他达拉非片正确服用方法
  • 做婚纱摄影网站网络平台有哪些
  • 蚌埠专业制作网站的公司长沙网站搭建优化
  • 推广型网站开发软件深圳seo