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

结构体内存大小计算方式

  • 内存
  • 2024-05-07 02:28:28
  • 9166

一、从成员元素的数据类型,及其所占内存空间大小的角度简述结构体与数组的区别计算方法:sizeof运算符对于32位系统可以计算特定类型的大小,sizeof(char)
=
1;
sizeof(int)
=
4.计算基本数据类型的大小很容易,所以我们来看看如何计算生成的数据类型的大小。C语言中共有三种内置数据类型:数组、结构体和联合体。数组是同一类型元素的集合,只要计算出单个元素的大小,整个数组所占用的空间就等于基元素的大小乘以元素的数量。结构中的成员可以具有不同的数据类型,并且成员按照定义的顺序存储在持久内存空间中。与数组不同,结构体的大小不是所有成员大小的简单总和。存储结构体变量时必须考虑系统的地址对齐问题。看下面的结构:struct
stu1{int
i;char
c;int
j;};首先介绍一个相关的概念——位移。偏移量是指结构体变量的成员地址与结构体变量的地址之间的差值。结构的体积等于最后一个构件的位移加上最后一个构件的体积。显然,结构体变量的第一个成员的地址就是该结构体变量的首地址。因此,第一构件i的位移为0。第二构件c的位移为第一构件的位移加上第一构件的体积(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成员的偏移量第二个成员的大小(4+1)给出值5。实际上,由于存储变量时的地址对齐要求,编译器在编译程序时会遵循两个原则:1.成员在结构体变量中的偏移量应该是成员大小的整数倍(0是任意整数倍)
2.结构体的大小必须是所有成员大小的整数倍。与第一个元素相比,上例中,前两个成员的偏移量满足要求,但第三个成员的偏移量为5,不是其大小(int)的整数倍。编译器在处理时会在第二个成员后面添加3个空字节,这样第三个成员的偏移量就变成8。根据第二个元素,结构体的大小等于最后一个成员的偏移量加上它的大小。上例中计算出的大小为12,满足要求。我们来看一种满足第一个条件但不满足第二个条件的情况:struct
stu2{int
k;short
t;};
请采纳