当前位置:首页 > 内存 > 正文

结构体的内存大小(结构体数组内存分配)

  • 内存
  • 2024-07-26 05:49:13
  • 4179

一、iOS-结构体内存分配

CGPoint是OC中的一个结构体。结构通常使用内存对齐来分配。
1.结构体的每个成员相对于结构体首地址的偏移量是成员大小的整数倍。如有必要,编译器将在成员之间添加填充字节。
2.结构体的总大小是结构体最大成员大小的整数倍。
3.结构体变量的首地址可以除以其最大基类型成员的大小。
4.对于成员属性包含结构体变量的复合结构体,在确定最大基类型成员时,必须包含该复合类型成员的子成员。然而,在确定复合类型元素的偏移位置时,复合类型被视为一个整体。
5.总结:结构体的大小等于最后一个成员的偏移量加上其大小加上末尾的padding字节数,即:sizeof(struct)=offsetof(lastitem)+sizeof(lastitem)+sizeof(trailingpadding)

示例1:

第一个成员相对于结构体首地址的偏移量为0,是inti成员(长度4)的整数倍。
第二个成员相对于结构体首地址的偏移量为4,是该成员字符(长度1)的整数倍。(由于结构体的总大小是结构体最大成员的大小的整数,如果结构体只有这两个成员,则charc后面会添加3个填充字节,但现在有3个成员,所以不需要)
第三个成员距结构体首地址的偏移量为5,不是intx成员的整数倍,因此在x之前(或c之后)填充3个字节,这样x偏移量达到8,变为4的整数倍,因此该结构体的内存大小为4+1+3+4。

示例2:成员数量和每个成员类型相同,但顺序不同,内存大小不同。

示例3:复合结构体

#pragmapack(n)//编译器将按钮对齐到N个字节,并设置该结构体的最大成员大小(与实际最大相同)肢体尺寸肢体尺寸较小)。换句话说,结构体的最终长度是n的整数倍。
#pragmapack()//取消自定义对齐方式。
#pragmapack(puch,1)//保存原来的对齐方式并设置新的对齐方式。
#pragmapack(pop)//恢复之前保存的对齐状态
#pragmapackparametertobe'1','2','4','8'或'16'预期
预期参数#pragmapack参数为'1'、'2'、'4'、'8'或'16'

演示

设置lAlignment后计算内存
1.当设置的对齐长度小于当前条长度时,条偏移量为条长度的整数倍。
2.当设置的对齐长度大于当前条长度且小于最长条长度时,条偏移量为设置对齐长度的整数倍。
3.当设置的对齐长度大于最长成员的长度时,成员偏移量将根据当前成员的实际尺寸进行对齐。
4.当定义的对齐长度小于最长元素的实际长度时,结构体长度为定义的对齐长度的整数倍。
5.当定义的对齐长度大于或等于最长成员的实际长度时,结构体长度为最长成员实际长度的整数倍。