c语言怎么对齐数字 结构体成员的字节对齐?
结构体成员的字节对齐?
这个问题非常严重。首先,我想说的是字节对齐的语法在不同的编译器下是不同的。在GCC中,它是#pragmapush(1)#pragmapack(),在MSC VC中的代码项可以调整,默认为8字节;typestruct{charcinti}test byte alignment,是alignment,例如char和int是4字节对齐的,那么char会占用4字节,一共8字节,结构对象存储是按顺序存储的,char必须在int前面。在第二种情况下,如果一个字节对齐,则表示char只占用一个字节,而int将占用四个字节。这种n字节对齐意味着每个成员占用的空间必须是n字节的倍数,小于n字节的占用n字节。所以把它和一个字节对齐,它需要五个字节。此外,根处理器与您提到的每种数据类型的低位还是高位在前面有关。Intel处理小型端对齐。例如,整数522387969用十六进制表示为:0x1f230201,在英特尔处理器中表示为0x0102231f,因此内存使用0x0102031f来表示522387969,这称为小端对齐。但在arm处理器中,522387969表示为0x1f230201,这被称为大端对齐,也被称为网络字节顺序。当然,上面提到的字节顺序只对内置数据类型(如intlongshort)有效。如果结构中有intlong这样的成员,那么也会有所谓的字节顺序。如上所述,无论顺序是什么,结构对象都是按顺序存储的。首先定义的成员必须在后面定义的成员之前,但单个成员具有字节顺序。我不知道怎么说明白吗?不,请仔细理解这句话:n字节对齐意味着每个成员占用的空间必须是n字节的倍数,小于n字节的占用n字节。如果大于n字节,它将构成n字节的倍数。例如,如果按3字节对齐,则4字节int将占用6字节。对齐与数据在内存中的位置有关。如果变量的内存地址是其长度的整数倍,则称为自然对齐。例如,在32位CPU中,如果整数变量的地址是0x00000004,则它自然对齐。字节对齐的根本原因是CPU访问数据的效率。假设上面整数变量的地址不是自然对齐的,例如0x00000002,那么CPU需要访问内存两次,如果它接受它的值。第一次从0x00000002-0x00000003取短,第二次从0x00000004-0x00000005取短,然后合并得到所需的数据。如果变量的地址为0x00000003,则需要访问内存三次,第一次访问char,第二次访问简称char,第三次访问char,然后合并得到整数数据。如果变量处于自然对齐位置,则只能检索一次数据。有些系统对对齐非常严格,如SPARC系统。如果获取未对齐的数据,则会发生错误。例如,char ch[8]char*P=& ch[1]int i=*(int*)P在运行时会报告为段错误,而X86上不会有错误,但效率会降低。
结构体字节对齐原则?
[structure PP{int afloat B char D}OO sizeof(OO)12字节
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。