注:先前本人小白理解有错,把位和字节搞混了,经同学提醒已改正错误。希望有更多的人指出我的错误,不胜感激。
在看结构体的时候,碰到内存对齐的问题,着实茫然了一阵。上C语言的时候就没有听老师讲过这个问题。。。。。。
百度了一下,我的理解是:系统分配内存时是以结构体中占字节数最大的类型为单位分配一块一块的内存的。所谓的内存对齐,就是系统为数据分配相同大小的单位空间,访问数据时可以加快访问速度。对于对齐作用,百科是这样子说的:为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
对于同种类型的数据,可以补满这个类型的单位内存空间。而不同类型的数据就要另外开辟一块单位内存。
结合例子说一下:
struct student{
char name[17];
int age ;
int num ;
int a ;
char m ;
}stu;
printf("%d",sizeof(stu));
首先,在结构体中int类型占4字节,char占1个字节,int类型占字节数最大,因此,系统分配内存是以4个字节为单位分配一块块内存。
char name[17] //占17个字节,但是4个字节为以单位,因此占20个字节,下一类型与他不是同一类型,故不可补充填满
int age;//占4个字节,剩下num,a都占4个字节
char m;//虽然只有1个字节,但是仍占4个字节单位空间
所以结果应该是36
换一下数据顺序:
struct student{
char name[17];
char m;
int num;
int a;
int age;
}stu;
printf("%d",sizeof(stu));
char name[17];//占17字节
char m;//由于与前一数据类型相同,可以补充填满上一数据所申请的内存空间而不必重新分配空间
所以输出应该是32