一、介绍结构体
结构体是一些值的集合,这些值称为成员变量。每个成员可以是吧不同类型的变量。
二、结构体声明,和设置变量
这里的s 是局部变量
这里的s1 s2是全局变量 结构体初始化 如上图所示。
三、结构体内存对齐
当我们想知道结构体在内存中是如何储存的时候,会发现当变量类型相同仅仅是顺序不同时,结构体的大小竟然是不一样的。这就引出了结构体是如何在内存中储存的这个问题。
根据资料我们能知道 结构体内存对齐的规则:
1.结构体的第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处。
2.从第二个成员开始,要对齐到某个【对齐数】的整数倍的偏移处。
对齐数:结构体成员自身大小和默认对齐数的较小值。 在VS环境下是8 。Linux环境下不设对齐数
3.结构体的总大小,必须是最大对齐数的整数倍。
4.如果嵌套了结构体 嵌套的结构体对齐到自己的最大对齐数的整数倍。 结构体的整体大小就是所有对齐数中最大的整数倍。
根据上面规则 他在内存中这样储存
0 char 占到0为初始位置 |
1 第二个成员 要偏移 某个对齐数 |
2 int 对齐数4 小于默认的8 |
3 所以在下标为4 开始储存int |
4 int |
5 int |
6 int |
7 int |
8 char 对齐数1 下标8 ok |
9 因为总大小 是对齐数的整数倍 |
10 最大对齐数为4 |
11 所以总大小应为 12 |
占用12个字节
他应该如何储存?
0 char 占到0为初始位置 |
1 char 对齐数1 下标2 ok |
2 |
3 |
4 int 对齐数4 下标4 ok |
5 int |
6 int |
7 int |
占用 8字节
了解了如何结构体内存对齐。 但是为什么要浪费空间这样储存结构体呢?
当我们读取内存时 在32位下,一次读取4个字节。 如果不浪费一些空间计算机读取一个int类型时,就要读取两次。而浪费一些空间,只需要读取一次就可以取出int类型了。
小技巧:
当我们创造结构题时,可以把char类型集中从而节省空间,提高代码性能。
设置默认对齐数
前文提过VS环境下,默认对齐数为8。Linux环境下不设默认对齐数。
应用 #pragma pack(数字) 就可以更改默认值。这里不过多介绍。
总结:
简单介绍了一下结构体和结构体内存对齐的知识,之后将介绍更多C语言的相关知识,感谢您的阅读,欢迎提出宝贵意见。