结构体的内存
一.提出疑问
结构体占用的是一片连续的内存空间,大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。
先举一个实例:
struct student { int age; //4个字节 int telephone; //4个字节 }; int main() { struct student s; // s的字节为8; printf("%d", sizeof(s)); return 0; }
如图,结构体student中含有2个int类型成员变量,代码运行后,可知结构体的大小为8个字节。
可真的是因为两个成员变量的大小之和嘛?
我们再来一个实例:
struct student { int age; //4个字节 char name; //1个字节 int telephone; //4个字节 }; int main() { struct student s; // s的字节为12; printf("%d", sizeof(s)); return 0; }
图中的三个成员变量分别为 int,char,int类型,三个成员变量的内存相加为9个字节,
可为什么结构体内存会等于12呢?
很明显结构体内存大小 不等于 所有成员变量的内存大小之和
二.计算结构体内存大小
在计算结构体内存大小时,我们得先学会一个规则-----对齐规则。
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
(VS中默认的值为8)
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
理论已出,现在来实践计算一下:
struct student { int age; //1个字节 char name; //1个字节 int telephone; //4个字节 }; int main() { struct student s; // s的字节为12; printf("%d", sizeof(s)); return 0; }
例如以上代码,借助图 解释:
解释思路:
- 首先根据规则,第一个成员得在地址为0处,然后成员的内存大小为4个字节,所以占用4个空间,地址0~3。
- 第二个成员变量得开始遵循对齐规则,由于char为1个字节,所以无论地址为多少,都是1的整数倍,也占用一个空间,地址4。
- 最后,第三个成员为int类型,此时地址已经到达了4的位置,而现在需要对齐int类型4个字节的整数倍,则需要从8开始,直到占有4个空间,地址8~11。
- 结束:结构体总大小为最大对齐数(成员变量的内存)的整数倍,而该结构体的最大的内存类型为int 4个字节,而此时使用的内存0~11,则是12,满足条件。
- 注:若是不满足时,则需要往后扩充,直到满足为止。
创作不易,路过的帅哥美女,动动小手,点点赞咯,蟹蟹啦
若文章有问题,请指出,虚心接受批评