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

蚌埠市建设工程质监站网站灰色关键词排名优化

蚌埠市建设工程质监站网站,灰色关键词排名优化,黄骅港房价多少钱一平,赤峰市网站建设复习下struct的大小、成员偏移量offsetof,说下我的理解: 64位下默认对齐数default8原则1:struct中每一个成员变量tmp的对齐数realmin{default,tmp} struct Student {int num;//0char name[8];double score; } stu; 这个结构体stu中&#x…

复习下struct的大小、成员偏移量offsetof,说下我的理解:

64位下默认对齐数default=8
原则1:struct中每一个成员变量tmp的对齐数real=min{default,tmp}

struct Student {int num;//0char name[8];double score;
} stu;

这个结构体stu中,第一个成员num为int的对齐数real_num=min{8,4}=4。
第二个成员name为char类型,对齐数real_name=min{8,1}=1。
第三个成员score为double类型,对齐数real_score=min{8,8}=8。
原则2:偏移量offsetof必须是real的倍数
1,所以第一个成员num偏移量startid=0*real_num=0*4=0,从startid开始size1=4即4个bytes被用掉即[id=0~3已用]。

2,因为上面size1=4已用4个bytes。第二个成员name偏移量是startid=real_name*倍数=1*倍数>3,故此时倍数取4,所以偏移量startid=4,而name的size2=8,所以id=4~11已用。


3,因为上面size1+size2=12已用12个bytes。而第三个成员score的偏移量startid=real_score*倍数=8*倍数,必需>11,所以倍数不能取0或1,只能取2,所以startid=8*2=16,即从16开始放score,而score的大小size3=8,此时id=16~23已用。所以stu这个结构体在内存中就是如下的样子:

所以stu的size等于id=0一直到id=23即size=24。所以逻辑是先计算偏移量,再自然计算得到struct整体的大小。

struct Test1 {int x;double y;
} t1;
struct Test2 {int x;char y[8];
} t2;

在t1中,对x来说 real_x=min{8,4}=4 偏移量startid=real_x*倍数=4*0=0,size1=4,id=0~3被使用。
在t1中,对y来说 real_y=min{8,8}=8偏移量startid=real_y*倍数=8*倍数,同时必需>3,所以倍数就是1,startid=8。

当你换成char y[8]后,如结构体t2所示:对y来说,real_y=min{8,1}=1 偏移量startid=real_y*倍数=1*倍数,同时必需>3,所以倍数就是4,startid=4。

由此可见,t1和t2偏移量不一样,所以struct的size是不一样的。虽然它们的成员变量都是4bytes、8bytes,但终究偏移量不同导致了结构体大小的不同。

原则3:struct的对齐数等于其所有成员real对齐数的最大值。

所以对于结构体嵌套结构体的情况,我们易知:

struct Student {int num;char name[8];double score;
};struct CombineStudent {short memb;Student originstruct[2];char lastmem[3];
} comstu;

现在结构体Student(由之前分析知结构体的size为24字节)作为新结构体comstu的成员,且个数为2的数组originstruct。
根据原则3,结构体Student的对齐数real_stu=max(real_num,real_name,real_score)=max(4,1,8)=8

对于结构体comstu:
1,第一个成员memb为short的对齐数real_mem=min{8,2}=2。偏移量startid=0*real_mem=0*2=0 而short占2字节即[id=0~1已用]。

2,第二个成员originstruct为Student类型,对齐数real_originstruct=min{8,8}=8,偏移量startid=倍数*real_originstruct=倍数*8,必须>1,故倍数=1,即偏移量startid=1*8=8。而每个Student占24字节现在有2个Student即[id=8~8+24*2-1也就是8~55已用]。
3,第三个成员lastmem为char类型,对齐数real_lastmem=min{8,1}=1,偏移量startid=倍数*real_lastmem=倍数*1,必须>55,故倍数取56即可,startid=56,而每个char占1字节现在共3个,共id=56~58已用。
但你以为结构体comstu的大小就是id=0~58=59吗?!天真,还有原则4!

原则4:结构体的总大小size必须是对齐数real的整数倍

所以虽然上面的结构体comstu的id=0~58=59,但结构体CombineStudent的real_comstu=max(real_memb,real_originstruct,real_lastmem)=max(2,8,1)=8!但是我们之前算好的59并不是real_comstu的整数倍!所以后面必须要补几位直到占到id=63,即id=0~63总size=64才是CombineStudent的大小!

所以大家这下明白为啥C++建议我们定义变量时按从一定的顺序去定,如换个位置:

struct Combine2Student {short memb;char lastmem[3];Student originstruct[2];
} ;

刚刚的结构体CombineStudent如果换成这样,结果就不一样了,可以节约内存。大家可以算算:

real_memb=min{8,2}=2,size1=2,startid=0是real_memb的倍数,占id=0~1;

real_lastmem=min{8,1}=1,size2=3,startid=2是real_lastmem的倍数,占id=2~4;

real_originstruct=min{8,8}=8,size3=24*2=48,startid=8是real_originstruct的倍数,占id=8~55;

算到这里,总id=0~55=56已经是real_Combine2Student=max(real_memb,real_lastmem,real_originstruct)=max(2,8,1)=8的倍数了,所以不需再补!所以结构体Combine2Student的size=56!

调换位置后命名相同的三个成员,但结构体Combine2Student就是比ComebineStudent占内存少!!!

http://www.khdw.cn/news/30638.html

相关文章:

  • 做网站的 简历东莞整站优化推广公司找火速
  • 何为网络营销?宁波网站推广优化
  • 同一服务器做两个顶级域名网站百度搜索指数排行
  • 杭州做美妆的网站公众号排名优化软件
  • 做模板网站怎么放视频教程谷歌推广培训
  • 眉山网站推广竞价托管是啥意思
  • synology做网站服务器网络培训平台有哪些
  • 织梦网站做站群南昌网站开发公司
  • 营销型网站建设供货商优化排名推广技术网站
  • 如何做网站授权网址semantic ui
  • 衡阳建网站线上营销策略都有哪些
  • 网站怎么做成二维码2024年最新时事新闻
  • 二级域名做网址导航大全网站百度竞价官网
  • 凤岗仿做网站站长之家音效素材
  • 网站推广怎么做的站长工具seo综合查询分析
  • 怎么样制作一个公司网站seo策略是什么意思
  • 唐山做网站的公司安卓优化大师历史版本
  • 秒玩大型游戏的网站最近一周新闻大事摘抄2022年
  • 一家做土产网站百度网盘客服24小时电话人工服务
  • 求有题目做的学习网站网站推广和精准seo
  • 网站内容分享新闻源发稿平台
  • 河南网站制作价格潍坊关键词优化平台
  • 网站导航是怎么做的公司网站首页设计
  • 南通做外贸的公司网站付费内容网站
  • html5动态网页代码seo搜索方法
  • 国际版网站可以在国内做推广吗创建网站花钱吗
  • 如何打开谷歌网站网站被禁用如何解决
  • 在上海哪个网站比较好网络营销ppt讲解
  • 平面设计师上的网站微信营销方法
  • 做网站优化有什么方法重庆seo结算