-
结构体声明 以及结构体变量创建
-
为什么会有内存对齐
-
如何计算内存对齐
在现实生活中 为了描述复杂个体 如 书本 人 单一的数据类型已无法满足我们的需要 这时候 自定义类型 结构体 孕育而生 结构是一些值的集合 里面的值称为成员变量 成员可以是不同类型的变量
结构体声明 以及结构体变量创建
struct Book //结构体声明
{
char book_name[20];
char bool_author[20];
int price;
char id[15];
};
/*
结构体声明是不开辟内存的
结构体变量创建才是开辟了内存
*/
结构体变量创建的两种方式
1.局部变量
int main()
{
struct Book sb1;
struct Book sb2;//结构体变量创建
return 0;
}
2.全局变量
struct Book //结构体声明
{
char book_name[20];
char bool_author[20];
int price;
char id[15];
}sb3,sb4; // 结构体变量创建
粗略的介绍了下结构体声明和其变量的创建 现在我们开始研究结构体的内存是如何存储的?
结构体的内存对齐
结构体在内存中是简单的顺序存储吗
struct S1 //结构体声明
{
char c1;//1
int I;//4
char c2;//1
};
struct S2 //结构体声明
{
char c1;//1
char c2;//1
int I;//4
};
printf("%d",sizeof(struct S1));
printf("%d",sizeof(struct S2));
以下是XCode环境下的运行结果 看看是不是你的预期结果
结构体内存对齐规则
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
为什么会有内存对齐
1.平台原因(移植原因)
某些硬件是无法访问任意地址
2.性能原因
提高读取效率 拿空间换时间
技巧tip:尽量1将小的成员放在一起
默认对齐数
如何修改默认对齐数
#pragma pack(4) //设置默认对齐数
#pragma pack( ) //取消(恢复)默认对齐数
如何计算内存对齐
假设这是内存块
struct S1 //结构体声明
{
char c1;//1 /8
int I;//4 /8
char c2;//1 /8
};
0. c1 |
1. 浪费 |
2. 浪费 |
3. 浪费 |
4. int |
5. int. |
6. int |
7. int |
8. c2 |
9 浪费 |
10 浪费 |
11 浪费 struct s1 end |
12. |
13 |
14 |
15 |
struct S2 //结构体声明
{
char c1;//1
char c2;//1
int I;//4
};
0。c1 |
1. c2 |
2. 浪费 |
3。浪费 |
4 int |
5 int |
6 int |
7int struct s2 end |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
总结
以上就是本文的全部内容啦。喜欢的朋友一键三连 你的点赞是我创作的动力