1 / 18
文档名称:

结构体对齐方式.docx

格式:docx   大小:20KB   页数:18
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

结构体对齐方式.docx

上传人:我是开始 2020/10/17 文件大小:20 KB

下载得到文件列表

结构体对齐方式.docx

文档介绍

文档介绍:对齐原则为:单字节变量无需对齐,可放在任何地址双字节变量起始地址为2的倍数4字节变量首地址为4的倍数一个结构体变量定义完之后,其在内存中的存储并不等于其所包含元素的宽度之和。例一:#include<iostream>usingnamespacestd;structX(chara;intb;doublec;}S1;voidmain()(cout<<sizeof(S1)<<endl;cout<<sizeof()<<endl;cout<<sizeof()<<endl;cout<<sizeof()<<endl;}比如例一中的结构体变量S1定义之后,经测试,会发现sizeof(S1)=16,其值不等于sizeof()=1、sizeof()=4木日sizeof()=8三者之木日,这里面就存在存储对齐问题。原则一:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。比如此例,首先系统会将字符型变量 a存入第0个字节(相对地址,指内存开辟的首地址);然后在存放整形变量 b时,会以4个字节为单位进行存储,由丁第一个四字节模块已有数据,因此它会存入第二个四字节模块,也就是存入到4~8字节;同理,存放双精度实型变量c时,由丁其宽度为8,其存放时会以8个字节为单位存储,也就是会找到第一个空的且是8的整数倍的位置开始存储,此例中,此例中,由丁头一个8字节模块已被占用,所以将c存入第二个8字节模块。整体存储示意图如图1所示。0a(char)1234h"5618cP10111213'1415图1结构体st存储结构示意图考虑另外一个实例例二:structX(chara;doubleb;intc;}S2;在例二中仅仅是将double型的变量和int型的变量互换了位置。测试程序不变,测试结果却截然不同,sizeof(S2)=24,不同丁我们按照原则一计算出的8+8+4=20,这就引出了我们的第二原则。原则二:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。例二中,我们分析完后的存储长度为20字节,不是最宽元素长度8的整数倍,因此将它补齐到8的整数倍,也就是24。这样就没问题了。其存储示意图如图2所示。°a(char)1234S67Sb(dciible)101112131415c(int)171®1920补齐到8的整数猎21力*图2笥构阵S2存储拓构示意图掌握了这两个原则,就能够分析所有数据存储对齐问题了。再来看几个例子,应用以上两个原则来判断。例三:doublea;charb;intc;}S3;首先根据原则一来分析。按照定义的顺序,先存储double型的a,存储在第0~7个字节;其次是char型的b,存储在第8个字节;接下来是int型的c,顺序检查后发现前面三个四字节模块都被占用, 因此存储在第4个四字节模块,也就是第12~15字节。按照第一原则分析得到16个字节,16正好是最宽元素a的宽度8的整数倍,因此结构体变量S3所占存储空间就是16个字节。存储结构如图3所示。0a(double)1234551Sb(char)510 '1112c(int)13 [1415图3结构体S3序储结构示意图例四:doublea;charb;intc;chard;}S4;仍然首先按照第一原则分析,得到的字节数为 8+4+4+1=17;再按照第二原例五:则补齐,则结构体变量S4所占存储空间为24。存储结构如图4所示:0a(double)123456 178b们bar)9191112c(int)1314151。17补齐到£的;■ 整数借:13192021n图4结构体S4存储瓮构示意图(doublea;charb;intc;chard;inte;}S5;同样结合原则一和原则二分析,可知在S4的基础上在结构体内部变量定义最后加入一个int型变量后,结构体所占空间并未增加,仍为24。存储结构示意图如图5所示。D己〔dgbl司12345 1678 「c(char)g10If12c(int)131415仍d(c:haf)17IS1920e(inQ212223图5结构障35存储结构示意图例六:如果将例五中加入的变量e放到第一个定义的位置,则情况就不同了。结构体所占存储空间会变为32。其存储结构示意图如图6所示。structX(inte;doublea;charb;intc;chard;}S6;0e(inl)1234578a(double)9101**********t(char)1713

最近更新

2026年山西金融职业学院单招职业倾向性测试模.. 41页

2026年巴中职业技术学院单招职测考试题库必考.. 42页

2026年广东岭南职业技术学院单招职测备考题库.. 41页

2025年苏州百年职业学院中单招职业技能考试模.. 39页

2026年广东省阳江市单招职业适应性测试模拟测.. 42页

2025年菏泽学院单招职业倾向性测试题库汇编 38页

2025年营口职业技术学院单招职业技能考试模拟.. 41页

2025年衡阳幼儿师范高等专科学校单招职业适应.. 43页

2025年襄阳职业技术学院单招职业适应性测试模.. 41页

2026年广西生态工程职业技术学院单招职业技能.. 41页

2026年广西经济职业学院单招职业倾向性测试模.. 42页

2025年西安海棠职业学院单招职业技能考试模拟.. 39页

2025年西安职业技术学院单招职业技能考试模拟.. 40页

2025年西昌民族幼儿师范高等专科学校单招职业.. 39页

2025年许昌电气职业学院单招职业适应性考试模.. 40页

2026年成都工贸职业技术学院单招职业技能考试.. 41页

2025年贵州护理职业技术学院单招综合素质考试.. 41页

2026年护理单招模拟试题附答案 43页

2025年贵州电子科技职业学院单招职业适应性考.. 40页

2025年贵阳职业技术学院单招职业适应性测试模.. 41页

2025年赣州职业技术学院单招职业适应性测试模.. 41页

2026年枣庄职业学院单招职业技能测试模拟测试.. 42页

2025年辽宁建筑职业学院单招职业适应性测试模.. 38页

2025年辽宁现代服务职业技术学院单招职业技能.. 40页

2025年辽宁省大连市单招职业适应性考试模拟测.. 42页

2026年江苏商贸职业学院单招职业倾向性测试模.. 41页

2026年江苏省宿迁市单招职业适应性考试模拟测.. 41页

2025年运城师范高等专科学校单招职业倾向性测.. 39页

2025年通化医药健康职业学院单招职业倾向性测.. 41页

2025年遂宁能源职业学院单招职业技能考试模拟.. 41页