结构成员对齐的问题.doc_第1页
结构成员对齐的问题.doc_第2页
结构成员对齐的问题.doc_第3页
结构成员对齐的问题.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统):TypeAlignmentchar在字节边界上对齐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_vec32 _attribute_(_aligned_(32),_section_(.data.cacheline_aligned) ;将tasklet_vec32编绎到.data.cacheline_aligned段,并将它在32字节边界上对齐;void do_exit(long error_code)_attribute_(noreturn);do_exit不会返回;struct Xgt_desc_struct unsigned short size; unsigned longaddress _attribute_(packed);将address在结构中紧凑排列。-MSDN-#pragma pack(n)When you use #pragma pack(n), where n is 1, 2, 4, 8, or 16, each structure member after the first is stored on the smaller member type or n-byte boundaries. If you use #pragma pack without

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论