结构体的内存对齐

在研究完结构体传参和构建之后,我们或许有这样的疑问,结构体在内存中是如何存储的,接下来以一排代码为例:

Struct stu
{
 char i;
 char d;
 int m=0;
}
int main()
{
 Struct stu s1;
 printf("%d",sizeof(s1));
}

在为了解结构体存储规则之前,我们会认为答案应为6,但结果确实8,这是为什么呢?接下来就哟由我来介绍结构体的对齐规则:

1.第一个成员在与结构体变量偏移量为0的地址处

2.其他成员变量要对齐到某一个数字(对齐数)的整数倍的地址处

vs中对齐数默认为8

3.结构体总大小为最大对齐数的整数倍

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,总大小就是最大对奇数的整数倍

结构体的内存对齐_第1张图片

由此规律,上述例子在内存中的存储即如此,故为8

那我们或许又有疑问,为什么会有内存对齐呢?

第一种就是平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的

第二种就是性能原因:数据结构应该尽可能的在自然边界上对齐

如果想修改默认对齐数的话,只需引用#pragma pack()即可

举个例子:
 

#pragma pack(4)
Struct S
{
char c;
double d;
};

 结果从原来的16变为12,即改变了默认对齐数的大小

接下来我们一起了解一下位段的概念:
位段的声明和结构是类似的:
1.位段的成员必须是int unsigned int或signed int 和char 

2.位段的成员后边有一个冒号和一个数字

3.按照需要y以4个字节或者1个字节来开辟空间

Struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};

从上述代码来看,共占47个比特位

结构体的内存对齐_第2张图片

 稍作分析可以看出前15个比特位不知道是否使用,故位段无法跨平台

最后,希望以上文章对您有帮助!

你可能感兴趣的:(c语言)