结构储存分配是一个很重要,很基础的东西,面试的时候大多数面试官都会问到的问题,所以在此还是有必要去讲一下!
首先我们必须知道三个概念:
1.结构体内存对齐。
(1)为什么要有结构体内存对齐?
答:使用空间来换取时间的设计;和平台有关
(2)如何对齐?
2.其次以下概念我们必须牢记:
(1)默认对齐数:vs/vc------8;
linuc-------4;
(2)偏移值(处):相对于起始位置的的位置。例如起始位置是2,那么2就是0偏移处,3就是1偏移处;
(3)对齐数:自身大小和默认对齐数的较小值;假设默认对齐数是8,int类型的对齐数就是4.因为int大小是4,小于8.
3.结构体内存对齐原则:
(1)结构体第一个成员永远放在0偏移处;
(2)第一个成员以后的每个成员必须对应到自身对齐数的整数倍偏移处;
(3)结构体大小必须是最大对齐数的整数倍;
举例子:
1.求类型A的内存大小:
typedef struct A
{
int i;
char a;
double d;
}A;
答案:16
分析:
2.求类型A的内存大小(结构体成员有数组形式):
typedef struct A
{
int i;
char a[5];
}A;
答案:8;
分析:将char a[5]看做五个char元素,根据上面的规则求取大小;
3.求类型A的内存大小(结构体镶嵌):
typedef struct B
{
char c;
double d;
}B;
typedef struct A
{
int i;
char a[5];
B b;
}A;
答案:32
分析:
学习这块内容我们还有知道:
自定义类型中的:结构体声明,结构体的初始化,结构体的自引用,数传递的效结构体做参率,柔性数组,位段(位域),枚举的声明,枚举和#define 标识符之间区别。
这些知识点都是很重要的,所以推荐意见博客大家可以看看
ok!!! 继续加油!!!