2016 - 2024

感恩一路有你

c语言结构体对齐规则 结构体字节对齐原则?

浏览量:2398 时间:2021-03-10 14:43:42 作者:admin

结构体字节对齐原则?

对齐与内存中数据的位置有关。如果变量的内存地址是其长度的整数倍,则称为自然对齐。例如,在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上不会有错误,但效率会降低。

内存对齐的规则?

为了加快计算机的访问速度,编译器在默认情况下对内存进行字节对齐。结构(包括类)字节对齐的原则如下:

1)结构变量的第一个地址可以除以其最宽的基本类型成员的大小;

2)结构的每个成员相对于结构的第一个地址的偏移量是成员大小的整数倍。如果需要,编译器将在成员之间添加内部加法;

3)结构的总大小是结构最宽基本类型成员大小的整数倍。如果需要,编译器将在最后一个成员之后添加尾随填充。Structsbyte1{double//offset 0~7charj//offset 8inta//offset 12~15,因为9不能被4除,请先填写9~11}sizeof(sbyte1)//=16structsbyte2{charj//offset 0double//offset 8~15,因为1不能被8除,请先填写1~7inta//offset 16~19}sizeof(sbyte2)//=24,为了得到8的倍数,填20~23

结构体成员的字节对齐?

c语言结构体对齐规则 struct字节对齐规则 结构体是怎么分配内存的

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。