对内存对齐和位域的理解

内存对齐

内存对齐,为了提高程序性能,数据结构(栈)在保存时应该尽可能地在自然边界上对齐。

我自己的理解是,如果没有内存对齐,cpu在访问某些未对齐的数据时,要进行两次访问才能读取完数据;而如果是内存对齐的数据,cpu以整块整块的访问,只需要进行一次访问就能读取到数据。在一次访问中就可以减少近一半的响应时间,在进行成千上万次访问时会大大减少程序响应时间,进而大大提升计算机的运算速度。所以内存对齐是非常有必要的。

内存对齐在结构体大小上有很直观的体现,如图

对内存对齐和位域的理解对内存对齐和位域的理解对内存对齐和位域的理解

·计算结构体A的大小,A中包含了一个int型数据和一个char型数据,应该为4+1=5个字节(在windows32位系统上),但是计算结构体大小结果为8.在这个例子中,结构体会以结构体中最大的一个数据类型的大小为它的对齐模数n,在访问时,会以n个字节为单位进行访问,故它的数据成员保存在以n个字节为自然边界的内存上,在最后不够n的倍数个字节时会自动补齐。所以这个结构体的char型数据虽然只占了一个字节,但是它后面会自动补上3个字节到8个字节,最后结果必然是它的对齐模数4 的整数倍。

成员的内存分配规律:从结构体的首地址开始向后依次为每个成员寻找第一个满足条件的首地址x,该条件是x %n = 0,并且整个结构的长度必须为各个成员所使用的对齐数中最大的那个值的最小整数倍,不够就补空字节。

当然,对齐模数也可以自定义,用#pragma pack(n)函数可以自定义对齐模数为n,如图

对内存对齐和位域的理解对内存对齐和位域的理解对内存对齐和位域的理解

在用#pragma pack(1)将对齐模数定义为1时,结构体的大小测量结果为5.

位域

位域是指信息在保存时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位。为了节省空间,C语言提供了一种数据结构,叫“位域”或“位段”。
“位域“是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数,每个域有一个域名,允许在程序中按位域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
位域的使用和结构成员的使用相同,其一般形式为:位域 变量名.位域名 位域允许用各种格式输出,如图
对内存对齐和位域的理解
对内存对齐和位域的理解
对内存对齐和位域的理解