2016 - 2024

感恩一路有你

c语言结构体对齐规则 内存对齐的目的和规则?

浏览量:2628 时间:2021-03-11 22:19:55 作者:admin

内存对齐的目的和规则?

有四种内存对齐原则:

1)。数据成员对齐规则:结构(或联合)的数据成员。第一个数据成员放置在偏移量为0的位置。之后,每个数据成员存储的起始位置从该成员大小或其子成员大小的整数倍开始(只要该成员有子成员,如数组、结构等)(例如,在32位计算机中int为4字节,则应从4的整数倍地址开始存储)。基本类型不包括struct/class/Uinon。

2) . struct as member:如果一个结构中有一些结构成员,那么应该从结构中“最宽的基本类型成员”的整数倍地址存储结构成员。(结构a包含结构B,而B包含char、int、double和其他元素,那么B应该从8的整数倍存储。)。

3) . 收尾工作:结构的总尺寸,即sizeof的结果,必须是结构内部最大构件的“最宽基本型构件”的整数倍。弥补不足。(基本类型不包括struct/class/Uinon)。

4) . sizeof(Union),结构中最大的元素是Union的大小,因为在特定时间,只有Union的一个成员实际存储在地址中。

内存对齐的规则?

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

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

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

结构体字节对齐原则?

C中的结构对齐问题:结构占用的位数是数据的整数倍,结构成员占用的位数最长。在这种结构中,结构占用的比特数是双重类型的整数倍。虽然这种结构使用位场,但对结果没有影响。Int i占用四个字节,char J占用一个字节。这两个字节总共占用八个字节,尽管最后三个字节是无用的。inta本身占用4个字节,但与结构对齐需要8个字节。双B需要8个字节。总计8=24字节

如何理解struct的内存对齐?

Commons:sizeof(Union data1)的值是16。默认情况下,Commons的最大基本类型是double,它占用8个字节,因此Commons与8对齐。字符数组C2占用9字节,因此整个公共体应该占用9字节,但根据对齐原则,实际分配给它的内存是16字节。Struct:Struct数据与8字节对齐,long类型的成员1分配8字节。s、 I、C和a最初分别占用4、2、1和10字节。考虑到对齐方式,s分配4个字节,I分配2个字节,C分配2个字节。此时,8个字节刚刚用完。最初分配了10个字节。考虑到对齐,整个结构占用的存储空间是8的倍数,因此分配了16个字节。因此,结构数据占用84216=32字节。

c语言结构体对齐规则 内存对齐规则 C语言内存对齐

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