【结构体】关于结构体的地址对齐
结构体作为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));
}sizeof结构体大小
这样我们可以得到⼀个结果为: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)成员内容不变,但是调换了顺序以后,所占的内存变⼩了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论