在开始前,我们先看两道题,大家认为这两段代码输出的结果各是多少呢?
struct
S1
{
char
c1
;
int
i
;
char
c2
;
};
printf
(
"%d\n"
,
sizeof
(
struct
S1
));
struct
S2
{
char
c1
;
char
c2
;
int
i
;
};
printf
(
"%d\n"
,
sizeof
(
struct
S2
));
答案是:
![](https://i-blog.csdnimg.cn/blog_migrate/1c44205b450f005fa148f408eff18407.png)
这是为什么呢?
下面请让我讲给你听。
首先,结构体在内存中存储是有规则的
1.
第一个成员在与结构体变量偏移量为
0
的地址处。
2.
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数
=
编译器默认的一个对齐数 与 该成员大小的
较小值
。
VS
中默认的值为
8
3.
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4.
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
单看规则是不是不好理解,下面我们以上题为例,看看前三条规则怎么理解
![](https://i-blog.csdnimg.cn/blog_migrate/22250eec9110eeb7351b910dad0240fd.png)
现在大家可以自己将第二题写出来了吗?
然后让我们看看最后一条规则
同样的我们还是通过题来理解
struct
S3
{
char
c1
;
struct
S1 s1
;
double
d
;
};
printf
(
"%d\n"
,
sizeof
(
struct
S3
));
先看看答案:
![](https://i-blog.csdnimg.cn/blog_migrate/ad04d23f742d8cbbb00b585983c52f28.png)
![](https://i-blog.csdnimg.cn/blog_migrate/21f4bfcb214024894b9193f646f418a5.png)
到此,规则就讲解结束了。
那么,结构体为什么宁愿浪费空间仍要对齐呢?为了节省时间。