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字节。例如,在16位计算机中,变量按2字节对齐。例如,虽然成员a是char类型,其地址在0x80000000中只有1个字节,但下一个成员B不能使用0x80000001的地址,而必须使用0x8000000002的地址,即按字长对齐。上述结构占用的空间为24 28=16字节
c语言结构体对齐规则 结构体强制类型转换 C语言结构体不对齐
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。