创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c语言系列专栏:c语言之路重点知识整合 🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
更多结构体知识点:结构体详解
目录
- 一、现象
- 二、原理
- 用例解释:
- AA结构体中:
- AA2结构体中:
- 文末检验:
一、现象
先定义一个结构体:
struct AA
{
int a;
short c;
char b;
} ;
对该结构体的空间大小进行计算:
int main()
{
//测试不同结构体的空间大小
printf("%d\n",sizeof(struct AA));
return 0;
}
结果为8
如果将AA结构体中的变量顺序进行改变:
struct AA2
{
short c;
int a;
char b;
};
再次输出该结构体的内存空间大小:
我们只是将结构体中的变量顺序进行了改变,内存空间居然发生了改变,结果却变成了12
按照之前对结构体的理解,我们并没有规定结构体内部变量的定义顺序
从本例可以看出,结构体内部变量的定义顺序也很重要
这种现象就是结构体的内存对齐补齐
二、原理
我本人是这么理解的:
操作系统对内存分配的动态内存分配算法:
结构体这里申请内存空间 使用的是 首次适应算法:从可用的内存空间中找到第一个能够容纳所需内存大小的空间,分配给请求内存的进程
根据结构体中所占字节数最大的 比如int 申请一些4字节的空间段,然后按顺序依次将结构体中其他的数据类型存入到这些相同空间(4字节)的内存段中。
用例解释:
用上面的AA和AA2结构体例子解释:
AA结构体中:
先根据结构体中的最大类型int确定 结构体中每一段空间为4字节(int的大小)
然后按照从上到下的顺序,将结构体中的变量放入内存段中
如果内存段大于等于变量的类型大小(AA中第一段内存空间4字节刚好放下4字节的a变量)
然后第二段内存空间为4字节,short类型的c变量占用2字节,可以放下,就将c放入,此时第二段内存空间还剩2字节
最后char类型的b变量占用1个字节,现在第二段的可用空间为2字节,可以放下,就将b放入,浪费1字节的空间
最终结果为2×4=8个字节
AA2结构体中:
还是先根据结构体中的最大类型int确定 结构体中每一段空间为4字节(int的大小)
然后按照从上到下的顺序,将结构体中的变量放入内存段中
如果内存段大于等于变量的类型大小,AA2中第一段内存空间4字节大于short类型c变量2字节,就将c放入第一段,此时第一段内存空间剩余2字节。
然后按照顺序该轮到int类型a变量4字节放入内存空间,但此时第一段内存空间只有2字节,就会放入(申请)第二段内存空间
(第二段内存空间和第一段内存空间大小一样,都是根据结构体中的最大类型int确定)(int的大小)
第二段内存空间为4字节,刚好放下a变量
接着时char类型的b变量,占用一个内存,但此时没有可用的内存空间,会再次申请4字节,b变量1个字节小于4字节,放入后浪费3字节的空间。
最终结果为3×4=12个字节
数组占用的空间:
将数组中的各成员拆成单个,再根据上文的规则放入
文末检验:
这个XX结构体自己模拟一下叭:
答案为32个字节,模拟一遍各变量放入内存的过程吧
因此,对于结构体中变量的定义顺序要有合理的规划,才能做到尽可能地不浪费过多空间。
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |