结构体的大小问题
程序员文章站
2024-02-21 21:59:34
...
在讨论结构体的大小前我们先回顾一下结构体的一些小知识,结构体作为一种自定义类型很方便的解决了同意存储区域内存储多个数据类型的问题,结构体的一个特别之处是在定义完成之后相当于内置类型,可以在另一个结构体的定义中使用.结构体不能定义一个自身的普通成员变量,但是可以定义一个指向自己的指针(常运用于链表).接下来通过一段代码展示结构体的定义和基本用法:
struct student a//定义一个名为a的结构体,大括号内为三个成员变量
{
char name[20];
int age;
char sex;
}a;//a也可以省略,加上之后方便后面用的时候可以直接简写成a
struct student b
{
float high;
float weight;
struct student a;//合法
}b;
struct student *p=&a;//定义一个指向结构体a的结构体指针变量p
a.age=90;//直接访问结构体中的元素
p->a.age=90;//通过指针访问结构体中的元素(前提是p经过定义)
下面我们来探讨结构体的大小,这还涉及到一个内存对齐的问题,内存对齐的初衷是节省内存,因此将不同类型的数据挨个存储,这就导致了再次访问存储区时的读取过程相对麻烦.在内存区域相对充足的当下,我们采用的是牺牲小空间,方便寄存器读取的原则存储.
原则一:计算单个结构体大小的时候以大的为准,结构体总字节数为最大字节数的倍数(一般都是小的字节数在前,大的在后面)
struct student a//向后对齐
{
short num;//2+2字节
int age;//4字节
char sex;//1字节+3字节 另外加上3个字节满足能被最大字节数整除
}a;//结构体大小为12字节
当然也存在特殊情况:结构体中包含结构体
struct a
{
int e;//4字节
struct i
{
char b;//1+3字节
int c;//4字节
};
};
原则二:拆分结构体时以单个最大为准.
这时候就存在时以对齐还是以八对齐的问题了.通过观察我们发现以4对齐可以解决问题.