作者:lao6345790 | 来源:互联网 | 2023-06-06 09:25
(一)内存地址对齐概念内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。当今的计算机在计算机内存中读
(一)内存地址对齐概念
内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐。当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的(在32位系统中,数据总线宽度为32,每次能读取4字节,地址总线宽度为32,因此最大的寻址空间为2^32=4GB,但是最低2位A[0],A[1]是不用于寻址,A[2-31]才能存储器相连,因此只能访问4的倍数地址空间,但是总的寻址空间还是2^30*字长=4GB,因此在内存中所有存放的基本类型数据的首地址的最低两位都是0,除结构体中的成员变量)。基本类型数据对齐就是数据在内存中的偏移地址必须等于一个字的倍数,按这种存储数据的方式,可以提升系统在读取数据时的性能。为了对齐数据,可能必须在上一个数据结束和下一个数据开始的地方插入一些没有用处字节,这就是结构体数据对齐。
当多个数据需要共享内存或者多个数据每次只取其一的时候,可以利用联合体union。在C Programming Language这本书中对联合体是这么描述的:
(1)联合体是一个结构
(2)它的所有的成员相对于基地址的偏移量都是0
(3)此结构空间要大到足够容纳最“宽”的成员
(4)其对齐方式要适合其中的所有的成员
下面解释这四条描述:
由于联合体中的所有的成员共享一段内存,因此每个成员的存放首地址相对于联合体变量的基地址的偏移量为0,也就是说所有成员的首地址都是一样的。为了使得所有的成员能够共享这一段内存,因此这个联合体的空间必须能够容纳这些成员中最宽的那个成员。对于那句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。
看下面的这个联合体的例子:
union U
{
char s[9];
int n;
double d;
};
s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。然而其实际大小并不是9,用运算符sizeof测试其大小为16.这是因为这里存在字节对齐的问题,9既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除。
参考链接:
http://blog.chinaunix.net/uid-23860671-id-2954592.html
http://blog.chinaunix.net/uid-26544753-id-3364725.html
http://blog.csdn.net/donkeylong/article/details/4909720
http://zhangyu.blog.51cto.com/197148/673792
http://www.cnblogs.com/dolphin0520/archive/2011/10/03/2198493.html
http://www.cnblogs.com/nyc-emacs/archive/2012/07/21/2601789.html