一文搞懂结构体内存对齐
结构体声明 以及结构体变量创建
为什么会有内存对齐
如何计算内存对齐
在现实生活中 为了描述复杂个体 如 书本 人 单一的数据类型已无法满足我们的需要 这时候 自定义类型 结构体 孕育而生 结构是一些值的集合 里面的值称为成员变量 成员可以是不同类型的变量
结构体声明 以及结构体变量创建
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;//4char c2;//1
};
struct S2 //结构体声明
{char c1;//1 char c2;//1int 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 |
总结
以上就是本文的全部内容啦。喜欢的朋友一键三连 你的点赞是我创作的动力
一文搞懂结构体内存对齐相关推荐
- printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...
这是工程师面试后的实际经历-- 这道经典.易错的关于C语言结构体内存对齐的题目,你真的会吗: 求32bit环境下以下结构体所占的字节数:typedef struct test_struct{ char ...
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...
- c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐
↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...
- 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...
脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因 1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...
- c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!
一.内存对齐的原因 1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...
- 细讲C语言结构体(结构体内存对齐你懂了吗?)
结构体 结构体类型的声明 结构体自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体 结构体的声明 结构体是一些值集合的,里面可以包括char,int,double等等的各种类型构成的 ...
- 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- 关于C语言中的结构体内存对齐与位段问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 结构体的内存对齐与位段 一.结构体的内存对齐 1.为什么会有内存对齐? 2.如何内存对齐 3. 如何在设计结构体的时候,既要 ...
- 谈谈C语言中结构体内存对齐问题及其offsetof宏的基本使用
前言 在C语言中,变量在内存中摆放的位置是有一定的规则的,不是想摆放到哪里就摆放到哪里,就比如常见的局部变量在栈区,全局变量在全局区等方式:而今天我们聊的结构体里面的成员变量呀,也是有一定的规则存放在 ...
最新文章
- 快速了解Kubernetes微服务中的通信
- Nginx的配置文件
- python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
- UA OPTI570 量子力学30 Degenerate Stationary Perturbation Theory简介
- 郑州大学采用计算机,郑州大学计算机系作业
- ios sqlite3 初级应用
- 腾讯云对象存储操作流程
- C++笔试题目大全(笔试宝典)
- mysql migration toolkit报错_MYSQL Migration Toolkit 安装
- 公众号网课搜题系统-掘光者题库
- 魅族20pro参数配置 魅族20pro值得买吗
- 如何禁止NavigationController的向右滑动返回
- 离散数学简单复习知识点汇总
- 常见的无法上网故障原因和解决方法
- echarts r 地图_pyecharts自定义地图
- Qt Quick 和qml介绍
- C++11的消息总线
- Inventor SDK入门---API设置零件材料
- 计算机软件大赛征稿,全国多媒体教育软件大奖赛征稿函
- 【中级软考—软件设计师】2操作系统2.2进程的概念【】:2.2.1进程的概念