@ 目录
结构体大小不规则的原因
结构体大小的计算,不仅仅只是各个类型单纯加起来。
结构体在底层实现中,需要顾及到执行效率--
"以空间换时间"
结构体所占内存空间可以多些没关系
但是对结构体内的成员变量访问速度必须提上去
提高访问速度,就是让结构体每个成员变量都占一样大小的字节
即让每个变量的步长一致
或者整体的步长一致
用官方的话说就是“内存对齐”
一、无嵌套结构体计算
结构体的大小=最终的偏移量
偏移量:从第一个变量开始,依次按变量类型所占的字节 [递加] 所得的值
偏移量(结构体大小)的计算,一般遵循以下两条规则。
(1) 结构体中成员的偏移量必须是该成员所在字节数的整数倍。
(任一变量之前的字节加起来要为当前变量所占字节的整数倍)
(2) 结构体的大小必须是所有成员的整数倍,即最小公倍数。
例子(1)
struct node
{
char a;// 1+3
int b;// 4 据规则(1) , a 占字节要加 3 与 b 对齐
double c;//8
};
变量 | 字节 | 计算 |
---|---|---|
char a | 1 | 1+3 |
int b | 4 | 4 |
double c | 8 | 8 |
总计 | 16 | 1+3+4+8=16 |
例子(2)
struct node
{
int a;
char b;
int c;
};
变量 | 字节 | 计算 |
---|---|---|
int a | 4 | 4 |
char b | 1 | 1+3(加3与 a 对齐) |
int c | 4 | 4 |
总计 | 12 | 4 + 1+3 +4 =12 |
二、有嵌套结构体计算
有嵌套的结构体 则需要 先展开 嵌套结构体
(1) 结构体中成员的偏移量必须是该成员所在字节数的整数倍。
(任一变量之前的字节加起来要为当前变量所占字节的整数倍)
(2) 结构体的大小必须是所有成员的整数倍,即最小公倍数。
struct kit
{
int a;
int b;
double c;
};
struct node
{
char A;
struct kit c;
char B;
};
上面的等同于下面这个
struct node
{
char A;
int a;
int b;
double c;
char B;
};
变量 | 字节 | 计算 |
---|---|---|
char A | 1 | 1+3 (加3与 a 对齐) |
int a | 4 | 4 |
int b | 4 | 4 +4(加4与 c 对齐) |
double c | 8 | 8 |
char B | 1 | 1+7(加 7 与所有成员变量对齐) |
总计 | 32 | 1+3 +4 +4+4 +8 1+7=32 |
总结
2021.3.26 23:34 二次更新
ps: 突然发现这篇博客之前的样子写成了我最讨厌的样子,很难让人理解,有违初心,特此修正。明天就要考二级啦,希望能够顺利通过吧!