问题:
在复习c语言中结构体时,遇到如下问题。
定义结构体:
typedef struct student{
char sex;
int age;
char status;
}STUDENT;
int main()
{
printf("%d",sizeof(STUDENT));
return 0;
}
试着去计算结构所占内存空间的大小:
思考
在32位操作系统中,int 所占4个字节,char占一个字节,那么结构体中所占数据字节不应该是6个字节大小吗。
分析:
因为在计算机中是按地址进行编码的,那么32位计算机在处理机在处理数据时是每四位进行取址操作数据。
所以就牵扯到一次取数据中是否会取到,“存粹的数据”。话不多说以图为例:
如图所示:
假设结构体中的数据在内存中的地址初始排列顺序为:
其中每个小方块代表一个字节,B;
那么我们可以通过上图来观察,如果计算机中是按照这种数据类型来存储结构体中定义的基本数据类型的话。在32位操作系统中,按照一次被处理机处理4B的话。即:
那么我们一次取到了char类型中储存的1B的数据以及int数据类型中的3B的数据,然后处理机会选择我们选择我们需要的,例如将1个B char数据保留3个B的int类型数据”摒弃“。那么”摒弃“后在想取出int型数据后从char型相邻的下一个内存单元开始继续取。
这样便的到了一个完整的int类型的数据,那么处理机会直接处理。
思考
通过上面的步奏可知,当我们想要取出int类型的数据时,处理机是经过两步才取到我们需要的数据。
而取出的char数据类型也不是“存粹的”char类型。那么有没有一个什么办法来解决这个问题,使得每次操作只操作一次即可取出我们所需要的数据,从而提高处理机的执行效率。
解决方案:
我们可以按照对应位数的操作系统一次处理的字节数来进行“内存对齐”操作:
以32位计算机为例:
以上图为例我们可以对未满足四个字节的数据进行补位即使他满足四个字节的大小,那么我们可以一次性将数据从内存中取出,这样便提高了效率,但是有一个问题是,补位后增加了内存的开销,导致占用空间过大。正所谓时间换空间嘛!
**注意:**如果取出的四位是由不同类型构成,且四位数据所占内存空间又刚好满足基本数据类型的大小,则不用分开一次就可以处理。例如基本数据类型的两个short类型。