结构成员对齐得问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
结构成员对齐得问题

为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性, 即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上, 即起始地址能够被4整除。变量的对齐规则如下(32位系统): Type Alignment char 在字节边界上对齐 short (16-bit) 在双字节边界上对齐 int and long (32-bit) 在4字节边界上对齐 float 在4字节边界上对齐 double 在8字节边界上对齐 structures 单独考虑结构体的个成员,它们在不同的字节边界上对齐。 其中最大的字节边界数就是该结构的字节边界数。 MSDN原话:Largest alignment requirement of any member 理解结构体的对齐方式有点挠头,如果结构体中有结构体成员, 那么这是一个递归的过程。 对齐方式影响结构体成员在结构体中的偏移设编译器设定的最大对齐字节边界数为n, 对于结构体中的某一成员item,它相对于结构首地址的实际字节对齐数目X应该满足 以下规则: X = min(n, sizeof(item)) 例如,对于结构体 struct {char a; int b} T; 当位于32位系统,n=8时: a的偏移为0, b的偏移为4,中间填充了3个字节, b的X为4; 当位于32位系统,n=2时: a的偏移为0, b的偏移为2,中间填充了1个字节,b的X为2; 结构体的sizeof 设结构体的最后一个成员为LastItem,其相对于结构体首地址的 偏移为offset(LastItem),其大小为sizeof(LastItem),结构体的字节对齐数为N, 则:结构体的sizeof 为: 若offset(LastItem)+ sizeof(LastItem)能够被N整除, 那么就是offset(LastItem)+ sizeof(LastItem),否则,在后面填充, 直到能够被N整除。 例如:32位系统,n=8, 结构体 struct {char a; char b;} T; struct {char a; int b;} T1; struct {char a; int b; char c;} T2; sizeof(T) == 2; N = 1 没有填充 sizeof(T) == 8; N = 4 中间填充了3字节 sizeof(T2)==12; N = 4 中间,结尾各填充了3字节 注意: 1) 对于空结构体,sizeof == 1;因为必须保证结构体的每一个实例在内存中都 有独一无二的地址。 2) 结构体的静态成员不对结构体的大小产生影响,因为静态变量的存储位置与 结构体的实例地址无关。 例如: struct {static int I;} T; struct {char a; static int I;} T1; sizeof(T) == 1; sizeof(T1) == 1; 3) 某些编译器支持扩展指令设置变量或结构的对齐方式,如VC, 详见MSDN(alignment of structures) 以下为Linux内核代码中的例子: __attribute__((regparm(0))) int printk(const char * fmt, ...)\ __attribute__ ((format (printf, 1, 2))); 禁止printk使用寄存器传递调用参数,并将printk的参数1作为printf格式串, 从参数2开始检查其类型; void __switch_to(struct task_struct *prev, struct task_struct *next)\ __attribute__((regparm(3))) ;__switch_to保留3个寄存器用作传递参数; void __attribute__ ((__section__ (.text.init))) mem_init(); 将mem_init编绎到.text.init段; struct tasklet_head tasklet_vec[32 ]\ __attribute__((__aligned__((32)),__section__(.data.cacheline_aligned))) ; 将tasklet_vec[32]编绎到.data.cacheline_aligned段,并将它在32字节边界上对齐; void do_exit(long error_code)__attribute__((noreturn));do_exit不会返回; struct Xgt_desc_struct { unsigned

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档