在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。

1. 为什么要内存对齐,不对齐会怎么样?

内存中存放数据是为了给CPU使用,CPU访问内存数据时会受到地址总线宽度的限制,也就是一次能从内存中拿多少数据到CPU(这里我们忽略CPU高速缓存)。而且,CPU从内存中获取数据时起始地址必须是地址总线宽度的倍数(我们用的intel CPU能处理不对齐的情况,某些CPU不能处理,即遇到不对齐程序会崩溃...)。

例如:CPU地址总线是64位(bit,8字节),当一个int(4字节)存储到地址: 0x06 时,CPU如何获取这个int值?

第一步:读取0x00~0x08 8个字节,然后保存后两个字节到 int 的前两个字节。

第二步:读取0x08~0x0F 8个字节,然后保存前两个字节到int的后两个字节。

图1-内存访问

上面的例子可以看到,从内存中读取一个int到CPU中需要从内存中读取两次。这样大大降低了执行的效率,如何提升性能? 答案就是内存对齐!

2. 内存对齐的单位是什么?

通过上面的分析,知道内存对齐的目的是为了让CPU能一次获取到数据,从而提升性能。学过汇编会了解,CPU只能使用基本类型,char, short, int, long, float, double 等,不能使用数组或结构体等复合类型(汇编中并没有一个指令能直接存取一个struct或数组)。所以:内存对齐的单位是基本类型,目标是让CPU能一次获取到基本类型的值。

3. 如何进行内存对齐?

通过上面的介绍,我们可以得出:

a. 内存对齐是指,变量地址的对齐,而不是变量大小的对齐。变量地址的对齐是指变量地址 对 变量大小求模为0。

b. 结构体中每一个成员都要求是内存对齐的。

c. 结构体中的数组,按数组的类型对齐。

4. 如何计算内存对齐

分析内存对齐,只需要记住上一个小节中:变量地址的对齐是指变量地址 对 变量大小求模为0。数组以数组本身的类型来计算,例如:char c[5] 按 char 类型大小计算对齐,double d[22] 按 double 类型大小计算对齐。

图2-示例程序
图3-运行结果

通过这个示例,仔细想想,内存对齐就很简单了。

c++ int 转 short_C/C++结构体内存对齐相关推荐

  1. 关于C语言中的结构体内存对齐与位段问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 结构体的内存对齐与位段 一.结构体的内存对齐 1.为什么会有内存对齐? 2.如何内存对齐 3. 如何在设计结构体的时候,既要 ...

  2. 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐

    17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...

  3. 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...

    脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...

  4. c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!

    一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...

  5. c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐

    ↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...

  6. printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...

    这是工程师面试后的实际经历-- 这道经典.易错的关于C语言结构体内存对齐的题目,你真的会吗: 求32bit环境下以下结构体所占的字节数:typedef struct test_struct{ char ...

  7. 室友利用一把王者的时间就学会了【C语言结构体内存对齐】

    文章目录 一.什么是结构体内存对齐? 二.结构体的对齐规则 结构体内存对齐规则的具体应用 三.为什么会存在内存对齐 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一.什么是结构体内存对齐? 从 ...

  8. 结构体内存对齐,默认对齐数,结构体传参

    我们先来计算一下结构体内存的大小 现在我们计算一下stu1和stu2每个成员内存偏移是多少. 在介绍偏移量之前,我们先简单介绍一下offsetof(是一个宏),它是用来计算结构体成员相较于起始位置的偏 ...

  9. 为什么要进行结构体内存对齐

    ###结构体内存对齐 ####什么是结构体内存对齐 结构体不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限于读取内存的要求,而是每个成员在内存中的存储都要按照一定 ...

最新文章

  1. 2022-2028年中国二次供水设备行业研究及前瞻分析报告
  2. vee-validate校验demo
  3. Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)
  4. supervisor配置文件中如何添加多个环境变量
  5. Eclipse中io操作提示找不到文件
  6. 学习 Message(3): 响应 WM_LBUTTONDOWN 消息
  7. 卸载 流程_一款适合于windows端的卸载神器 彻底清理残留软件
  8. linux系统wget、curl终端命令行获取公网ip地址及其他网络信息
  9. mybatis mysql 存储过程传入对象_mybatis 调用mysql存储过程 带输出输入参数
  10. Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load
  11. 如何制作个人网站(如何搭建个人博客)
  12. web大作业:基于html+css+javascript+jquery实现智能分控网站
  13. 计算机信息技术学ps吗,小学信息技术photoshop教案.docx
  14. word参考文献后面空格太大
  15. 史上最容易听错的歌词
  16. 新手如何起步做好微商,微商如何加精准好友?微商如何选产品!如何让别人主动加微信,怎么让别人主动加我微信!
  17. 10G SFP+万兆BIDI单纤光模块使用注意事项
  18. 华为ebgp_华为设备BGP详细配置
  19. Calculator Conundrum UVA - 11549(floyd判圈)
  20. c语言关键字翻译课程设计,课程的设计C语言关键字中英翻译机.doc

热门文章

  1. 帝国cms 打开打开转换表文件失败!
  2. python的用算法进制转换详解_学习python第五天进制转换
  3. 镭波笔记本安装linux,镭波笔记本windows7旗舰版系统下载与安装教程
  4. mysql使用 BETWEEN AND 查询
  5. Spring事务传播属性和隔离级别
  6. 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
  7. golang和php哪个性能更强,相同逻辑的php与golang代码效率对比,最好语言落谁家…...
  8. cwntos新建目录挂载磁盘_详解Linux磁盘挂载、分区、扩容操作的实现方法
  9. intel服务器最新主板芯片组,intel主板芯片组的介绍
  10. 后端技术:Java 程序员常犯的 10 个 SQL 错误!