【结构体】关于结构体的地址对齐
结构体作为C语言编程环境下一种重要的变量类型,在实际使用中有着广泛的应用,那么如何声明并使用一个结构体变量我相信读者应该有所了解,笔者也将不再重复。
本篇文章,请让我们将重点放在结构体变量的地址对齐上,对齐变量的地址有2个好处:
1.节省内存资源。
2.加快运行时的读取效率。
在内存中开辟一块空间变量时,是有要求的。
例如:(以32位电脑系统为例)
char型必须为1的整数倍
int 型为4的整数倍
等等
这多少多少整数倍,就是对变量地址宽度的要求,我们定义为M值(如上文中char型的M指为1,int型的M指为4)
但如果变量的尺寸大于系统位数(如:long 型等),将会造成阉割。
也就是说,最终的变量尺寸(以字节为单位)无法超过系统位数÷8。
在结构体的地址对齐中,以其中占据字节数最大的变量类型为最小整数倍。
以上是地址对齐应该遵守的规则。
我们以一个图例作为理解。同样地,以32位系统为例。
(在32位系统中,CPU读取字节以4个字节为单位。)
#include <stdio.h> struct demo{ char a; //1 int b;//4 long c; //8 short d; //2 }; int main(void) { struct demo test; //定义一个demo型结构体 printf("%d\n",sizeof(test)); }
这样我们可以得到一个结果为:20 = (1+3)+4+(4+4)+(2+2)
这样是我们这个结构体所占的内存大小。
我们现在调整以下这个结构体中的成员顺序:
#include <stdio.h> struct demo{ char a; //1 short d; //2 int b;//4 long c; //8 }; int main(void) { struct demo test; //定义一个demo型结构体 printf("%d\n",sizeof(test)); }
这样我们可以得到一个结果为:16 = (1+2 +1)+4+(4+4)
成员内容不变,但是调换了顺序以后,所占的内存变小了。
如果说我的文章对你有用,只不过是我站在巨人的肩膀上再继续努力罢了。
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/
若在页首无特别声明,本篇文章由 Schips 经过整理后发布。
博客地址:https://www.cnblogs.com/schips/

浙公网安备 33010602011771号