全攻略有点大放厥词,哗众取宠了,其实是一些常见的问题罢了。但是自认为总结的还算全面一点吧,请大家多多赐教,我只是个初学者。

接下来主要讨论四点:
一、不涉及位域的内存对齐
二、涉及位域的内存对齐
三、成员变量含有结构体的内存对齐情况
四、要求内存对齐的原因及优点

-----------------------------------------------------------------------------------

接着上一篇往下写~~

二、涉及位域的内存对齐
注:由于能力有限,在此仅讨论在VC++6.0编译环境下的情况,对于其他编译环境下的情况,由于没有硬件支持,只能作罢,但会将查到的相关知识贴在最后,但不做讨论。
涉及位域的内存对齐原则 如下,后用代码分析验证:
1) 若相邻成员变量类型相同,且其位宽之和不大于成员变量类型位宽(在次严重强调,是 类型位宽 而不是成员变量sizeof,也不是类型的sizeof或者其他什么)大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和不大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,不同位域字段存放在不同的位域类型字节中;(这一条其实会根据编译器的不同而采用不同的规则,此处以VC++6.0标准来说明)
4)其实不存在4),这一条是说,在此,还要遵守不涉及位域的2),3)条规则,已经部分遵守不涉及位域的第一条规则
实例分析,代码如下:

 1#include <iostream>
 2using namespace std;
 3struct A
 4
 5    char c1:4
 6    char c2:4;
 7    short s1:4;
 8    short s2:8;
 9    int i;
10}
;
11int main ()
12
13    A a; 
14    a.c1=1;a.c2=2;a.s1=3;a.s2=4;a.i=5;
15    printf("sizeof(A)=%d\n",sizeof(A)); 
16    return 0;
17}
将一步一步来分析内存情况:
1、从起始地址(假设为零)为c1分配空间,如下图:

2、接下来,为c2分配空间,由于c1和c2的类型都为char,且c1和c2的位宽之和为8不大于类型char的位宽8,根据规则1,c2的空间分配如下:


3、接下来,为s1分配空间,此时,有一个问题,s1的内存空间的起始地址是从哪儿开始呢?1还是2?根据上一节介绍的我们可知,s1的对齐模数为2,此处上一节的规则规则依然适用,结合这里的第三条,1处,填充CC,从2处开始分配:

4、接下来,为s2分配空间,重复第二步,非配如下(此处也要注意一下的,因为一个s2的空间非配跨越了两个字节,而且都不是完整的占有一个字节):

5、接下来为i分配内存空间便如同上一节讲的一样了,如下图:


6、我们看最终的内存空间分配结果:

7、最终的运行结果,也与分析一致:


呵呵,如果上边的你都看懂了,何不做做下边的这个小练习呢?看看你能做对不~