结构体求大小(1)

来源:互联网 发布:ubuntu 16.04添加字体 编辑:程序博客网 时间:2024/06/06 03:05

近日在不少学生面试的过程中遇到了关于求结构体大小(以字节为单位)等等相关问题,我也看过相当一部分资料,但大多数学生都不愿意去看大篇幅的文章,在此我用一此简单的实例和少量理论概述对结构体作一个分析:

 

试验用的编译器为VC6.0的C编译器,平台为Windows XP

 

定义一个结构体如下
struct test
{
   char a;
   int b;
}

对于结构体test而言,这个结构体的大小应该为8个字节,现在大家来看一下这个结构体在内存中的分配情况如下图:

 

内存位置:0   1    2    3    4    5    6    7

数据位置:a                     b

 

从上图可以看出,a后面将会有3个字节是空的,b 从第四个字节开始存储后面四个字节刚好够存一个int数据类型。

接下来我们分析一下为什么test的大小是8,而不是5或其它的。可以这样直观的理解一个动态内存分配的情况,编译器首先会在内存中给a分配一个字节去存放数据,接下来要去给b分配数据一个int(即4个字节)去存储数据,那么在这个时候,编译器不会仅随a的地址空间后面给b分配空间,实际会在a的后面空出3个字节后,才是b的地址,因为结构体的大小要满足一个内存对齐的原则。

内存对齐,可以简单理解为一个对齐尺度,要是再简单一点 内存对齐就是一个整数(即内存对齐系数,它是内存对齐的实际体现),每个结构体都有内存对齐系数,这个系数我们可以指定,也可以系统默认(test即为系统默认内存对齐系统)。

内存对齐系数规律:内存对齐系数为 n ,结构体实际大小为size,则一定满足size/n等于0.

 

根据这个规律,我们进一步分析test结构体大小,编译器要为结构体中的a分配空间时,由于char只占一个字节,结构体遵循1个字节对齐,当要给b分配空间时,由于int占四个字节,此时结构体就变为遵循4个字节对齐了,而结构体实际只用了5个字节存放数据,但为了满足内存对齐原规,因此在a后面空出了3个字节。这样结构体的大小实际为:1+3+4=8。

 

有问题的同学千万不要想为什么空出的字节是在a后面,而不是在b后面空3个字节,记住是在要给b分配空间时结构体要按4字节对齐的,而最初给a分配空间是按1个字节对齐,理所当然是要在a后面空3个字节了。

 

好了,内容不能太多,这一节能通过本文掌握test结构体实际内存分配情况,从实际去了解test大小为8个字节就可以了,想了解更多内容如:怎样合理定义一个结构体,如何对结构体按指定内存对齐系数,以及更复杂情况下结构体变量内存数据分配情况又如何,请看本博客下一次讲解。

留个题大家研究下:

struct test1
{
   char a;

   char b;
   int c;
}

 

struct test2
{
   char a;
   int b;

   char c;

}

 

test1和test2大小分别为多少,它们各自的内存分配情况又如何,具体对齐系数为多少?

 

本人才疏学浅,文中如有不足之处,请大家一起修改或留下宝贵意见!

老鸟可以略过。

原创粉丝点击