大家好,本次将会为大家讲解一下结构体中最重要的一个知识点,结构体的内存对齐。
首先让我吗看程序
struct S1
{
char c1;
int i;
char c2;
};
struct S2
{
char c1;
char c2;
int i;
};
可以看见两个可以说是一样的结构体,但是顺序发生了改变
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
}
那么按道理来说我们如果运行如上代码,那么结果是一样的
但是可以看见第一个的内存占用是12,而第二个是8
如果是想想中那么简单,那么我就没有必要拿出来说了
在正式开始之前,提示,下面会涉及offestof函数,如果没有了解建议参考文献
printf("%d\n", offsetof(struct S1, c1));
printf("%d\n", offsetof(struct S1, i));
printf("%d\n", offsetof(struct S1, c2));
我们来看看这个输出的结果
可以看见c1相对于存放在内存的0,i存放在内存的4的位置,c2存放在8的位置,按道理来说,c1c2是char类型占一个字节,那中间的不久浪费了,那为什么会浪费呢
我们再看下面这个
printf("%d\n", offsetof(struct S2, c1));
printf("%d\n", offsetof(struct S2, c2));
printf("%d\n", offsetof(struct S2, i));
为什么这又只浪费了两个字节呢
那么上面就可以说是偏离,那么我们来引出内存对齐的规则
1)结构体第一个成员直接对齐相对于结构体变量起始位置为0的地方
2)第二个成员开始,要对其到某个对齐数的整数倍的偏移处
对齐数:结构体成员本身和默认对齐数(vs:8)
3)结构体的总大小,必须是最大对齐数的整数倍
每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数
那么还有一种情况就是嵌套了结构体
4)嵌套的结构体对齐到自己的最大对齐数的整数倍外,结构体的整体大小就是所有最大对齐数的(含嵌套结构体对齐数)整数倍
讲到这里想必大家对次已经有所了解了,那么我们加讲一点
我们也可以自己修改默认对齐数
当然,他又其好必要其坏
好了,本篇文章到这里就已经结束了,谢谢各位的观看,本篇文章仅只对结构体内存对齐的简单介绍,若内容有所错误,欢迎提出。