💓博主CSDN主页:杭电码农-NEO💓
⏩专栏分类:C语言学习分享⏪
🚚代码仓库:NEO的学习日记🚚
🌹关注我🫵带你学习更多C语言知识
🔝🔝
1. 前言
文章目标:
本篇文章着重给大家讲解:
结构体内存对齐的知识
并且介绍位段,联合的内容
最后对这一板块做出拓展
结构体,位段和联合
这哥几个的区别和关联到底是什么?
2. 结构体内存大小问题
首先看下面这段代码:
struct S1 { char c1; int i; char c2; }; struct S2 { char c1; char c2; int i; };
这两个结构体中存放的都是
两个char类型和一个int类型数据
所以暂时推断出它们所占内存空间相同
那它们占了多大的空间呢?
char+char+int ,1+1+4=6
我们推断出它至少占6个字节
来验证一下:
printf("%d\n",sizeof(struct S1)); printf("%d\n",sizeof(struct S2));
结果很出乎意料,它们不仅内存不相同
并且和我们推断出的6也没有太大关系!
3. 结构体内存对齐规则
出现以上原因是因为:
结构体有特殊的内存对齐规则:
3.1 偏移量的概念
在这儿之前先介绍偏移量的概念:
3.2 内存对齐规则
对齐规则:
- 第一个成员在偏移量为0的地址处
- 其他成员要对齐到对齐数的整数倍处
- 结构体总大小为成员中最大对齐数的整数倍
对齐数概念:
对齐数 = min(编译器默认的对齐数 , 该成员大小)
- VS中默认对齐数为8
- linux中对齐数就是成员自身大小
比如在VS编译环境下:
struct S3 { double d; char c; int i; };
- d的大小是8,默认对齐数是8,对齐数就是8
- c的大小是1,默认对齐数是8,对齐数就是1
- i的大小是4,默认对齐数是8,对齐数就是4
3.3 内存对齐规则实例分析
拿上面的例子来分析
struct S3 { double d; char c; int i; };
已知:d的对齐数为8
c的对齐数位1
i的对齐数为4
结构体最大对齐数为8
可得: