C语言结构体的字节对齐及指定对齐方式.docx

C语言结构体的字节对齐及指定对齐方式.docx

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
文档从互联网中收集,已重新修正排版, 文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。 PAGE PAGE #如有帮助欢迎下载支持 内存中结构体的内存对齐 一、 字节对齐作用和原因: 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特泄 类型的数据只能从某些特左地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的 变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种 情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带 来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如 果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开 始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit 数据,显然在读取效率上下降很多。 二、 字节对齐规则: 四个重要的概念: 数据类型自身的对齐值:对于char型的数据,其自身对齐值为1,对于short型为 对于int, float, double类型,其自身对齐值为4个字节。 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。 指定对齐值:^pragma pack (value)时指泄的对齐value。 数据成员、结构体和类的有效对齐值:自身对齐值和指左对齐值中小的那个值。 补充: .每个成员分别按自己的方式对齐,并能最小化长度。 .复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类 型时,可以最小化长度。 .对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每 一项都边界对齐。 ^pragma pack(l) struct test { static int a; //static var double m4; char ml; int m3; } #pragma pack 0 //sizeof(test)=13; Class testl { }; //sizeof(testl)=l; /*注明: 1、 结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与 结构或者类的实例地址无关; 2、 没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都 有唯一的地址。*/ ^pragma pack(l) struct test { static int a; //static var double m4; char ml; int m3; } #pragma packO //sizeof(test)=13; Class testl{ }; //sizeof(test 1)=1; /*注明: 1、 结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与 结构或者类的实例地址无关; 2、 没有成员变疑的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都 有唯一的地址。*/ 示例://分析下而的例子C: /#指定按2字节对齐* /#指定按2字节对齐*/ struct C 文档从互联网中收集,已重新修正排版, 文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。 }; PAGE }; PAGE #如有帮助欢迎下载支持 文档从互联网中收集,已重新修正排版, 文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。 }; PAGE }; PAGE #如有帮助欢迎下载支持 char b; int a; short c; }; ^pragma pack () //恢复对齐状态 /* 第一个变量b的自身对齐值为1,指定对齐值为2,所以,其有效对齐值为1,假设C从0x0000 开始,那么b存放在0x0000,符合0x0000*1 = 0: 第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、 0x0003、0x0004、0x0005四个连续的字节空间中,符合0x000202二(h 第三个变量C的自身对齐值为2,所以有效对齐值为2,顺序在0x0006. 0x0007中,符合 0x0006%2=0. 所以从0x0000到0x0007共八字节存放的是struct C的变虽 又struct C的自身对齐值为 4,所以struct C的有效对齐值为2。 又 8%2=0, struct C 只占用 0x0000 到 0x0007 的八个字节。所以 sizeof (struct 0=8。 如果把上而的^pragma pack(2)改为#pragma pack(4),那么我们可以得

文档评论(0)

497721292 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档