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

结构体内存大小

  • 内存
  • 2024-05-07 13:45:42
  • 5167

一、iOS-结构体内存分配

CGPoint是OC中的一个结构体。1.结构体的每个成员相对于起始地址的偏移量是成员大小的整数倍,并且汇编器在必要时在成员之间添加填充字节。2.整体结构是最广泛成员规模的整数倍。3.结构体变量的初始地址可以除以其基成员的大小。4.对于成员属性包括结构变量的复合结构,在确定最广泛的基类型成员时必须包括复合类型成员的子成员。然而,当确定复合类型成员的偏移位置时,复合类型是作为一个整体来显示的。5.总结:结构体的大小等于最后一个元素的偏移量加上其大小加上末尾padding的字节数,即:sizeof(struct)=offsetof(lastitem)+sizeof(lastitem)+sizeof(Trailingpadding)

示例1:

第一个成员相对于结构体首地址的偏移量为0,为成员的整数倍。(长度4)
第二个成员结构相对于第一个地址的偏移量是4,它是成员电荷(长度1)的素数倍。(因为整个结构体的大小是一个整数,如果结构体只有这两个成员,后面会添加3个填充字节,但是现在有3个成员,所以不需要填充)
的偏移量从结构体首地址算起的第三个成员是5,它不是成员整数的整数倍,因此在x(或c)之前填充3个字节。x偏移量为8,并且是4的整数倍。所以这个结构体的内存大小是4+1+3+4。

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

示例3:复合结构

#pragmapack(n)//编译器通过将key修改N个字节来设置宽度成员大小(与实际宽度相同。成员大小更小)。即结构体的最终长度是n的整数倍。
#pragmapack()//删除自定义对齐方式。
#pragmapack(puch,1)//保存原来的对齐方式并设置新的对齐方式。
#pragmapack(pop)//恢复之前设置的对齐参数
expected#pragmapackparametertobe'1','2','4','8',or'16'
expected#pragmapack参数'1'、'2'、'4'、'8'或'16'

显示

设置对齐后的内存计算
1、什么时候设置对齐长度小于当前成员长度,则成员偏移量为成员长度的整数倍。
2
3.当集合的对齐长度超过最长成员的长度时,该成员的偏移量将调整为当前成员的实际大小。4.当设置的对齐长度小于实际最长成员长度时,结构体长度为设置的对齐长度的数倍。5.当数组长度超过或超过实际最长成员长度时,数组长度为最长成员长度的整数倍。


二、为什么c语言结构体的内存大小是24?指针的大小是固定的,与所指向地址的内容无关,而是与机器位数有关。
大小等于机器的位长,64位指针的大小为8,32位指针的大小为4。
如果编译器设置了对齐方式,那么:32位等于4*3=12。
你可以再运行一下看看。