文章目录

  • 一、前言
  • 二、内存对齐为4个字节的好处
  • 三、内存对齐的目的是以空间换取速度
    • 3.1、内存对齐为4的例子
    • 3.2、内存没有使用内存对齐的例子
  • 四、掌握内存对齐的必要性

一、前言


内存对齐的目的是为了提高CPU读写内存里数据的速度。现代的CPU读取内存并不是一个一个字节挨着读取,这样做的效率非常低。现代的CPU一般以4个字节(32bit数据总线)或者8个字节(64bit数据总线)为一组,一组一组地读写内存里的数据。

二、内存对齐为4个字节的好处


首先,了解一下CPU从内存里读取数据的流程:
第一步,CPU通过地址总线,找到该数据的位置。
第二步,通过控制总线,发送读取数据的指令。
第三步,通过数据总线,从内存里获取该数据的内容。

内存对齐使用4个字节的原因有:

  1. STM32单片机的数据总线与地址总线都是32bit(4个字节)。
  2. 方便DMA的搬运,DMA搬运的最大内存是32bit(4个字节)。

三、内存对齐的目的是以空间换取速度


3.1、内存对齐为4的例子

/* 先来一个简单的结构体 */
struct
{char a;int  b;}Test2;


CPU读取内存里数据的过程:

  1. 想找变量a:第一次读取就能找到。
  2. 想找变量b:第二次读取就能找到。
    这一点很重要,变量a与变量b各自只需要1次寻址就能完成读取。接下来看一看内存如果没有使用内存对齐的例子(当我不知道内存对齐时,我也是误以为内存里的数据是这样分布的!)

3.2、内存没有使用内存对齐的例子

如果内存没有使用内存对齐的话,构想的内存分布如下:

CPU读取数据的过程:

  1. 想找变量a:第一次读取就能找到。
  2. 想找变量b:先读取第一组内存的后三个字节,接着再读取第二组内存的第一个字节,最后将所有字节合并为4个字节。

如果内存没有使用内存对齐的话,CPU为了获取变量b花掉了两次地址寻址,接着还要将字节合并。所以,内存对齐可以有效地提高CPU读写内存的速度,但是浪费一点空间。

四、掌握内存对齐的必要性


了解内存对齐的作用后,就能弄懂为什么编译器要对某些内存做了填充。比如本章节的例子,如果结构体里只有一个char与int变量,无论是char变量在前,还是int变量在前,都肯定会浪费3个字节被用于填充,凑够4个字节变成一组数据被CPU一次性读取。
不过,当掌握内存对齐的知识点后,上一章节的例子就能避免更多的内存被浪费了。C语言 | 内存对齐01 - 什么是内存对齐

C语言 | 内存对齐02 - 为什么会有内存对齐?它解决了什么问题相关推荐

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

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

  2. c# 结构体 4字节对齐_C语言程序员们常说的“内存对齐”,究竟有什么目的?

    在C语言程序开发中,有时有经验的程序员会提起"内存对齐"一词,事实上,这也是C语言中结构体的 size 不等于它所有成员 size 之和的原因(C语言中的结构体的size,并不等于 ...

  3. C字节对齐与C++类对象内存布局

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  4. C语言union合并两个字节,C语言中的联合体union所占内存方式

    当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union).在C Programming Language 一书中对于联合体是这么描述的: 1)联合体是一个结构: 2)它的所有成员 ...

  5. 【C语言】自定义类型——计算结构体内存对齐

    文章目录 前言 一.结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 *结构体内存对齐 修改默认对齐数 结构体传参 结构体实现位段(位段的填充&可移植性) 二.枚举 枚举类型的 ...

  6. C语言内存管理内幕(二)----半自动内存管理策略

    2019独角兽企业重金招聘Python工程师标准>>> C语言内存管理内幕(二)----半自动内存管理策略 转载于:https://my.oschina.net/hengcai001 ...

  7. R语言ggplot2可视化使用vjust和hjust参数对齐图像中的文本注释信息(左对齐、右对齐、居中)实战

    R语言ggplot2可视化使用vjust和hjust参数对齐图像中的文本注释信息(左对齐.右对齐.居中)实战 目录

  8. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针...

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 1 2 3 4 5 6 ...

  9. c语言中指针往内存写值,C语言编程常见问题解答之指针和内存分配

    指针为C语言编程提供了强大的支持--如果你能正确而灵活地利用指针,你就可以直接切入问题的核心,或者将程序分割成一个个片断.一个很好地利用了指针的程序会非常高效.简洁和精致. 利用指针你可以将数据写入内 ...

最新文章

  1. 处理 react_【学习教程】React 中阻止事件冒泡的问题
  2. 哇哦!恍然大悟般的“share”功能的实现!
  3. C++中getline函数的使用
  4. 转]Window, Linux动态链接库的分析对比
  5. 《大道至简》的幕后故事
  6. mysql 学习笔记04 insert与update语句
  7. 华为鸿蒙系统自动驾驶,华为高阶自动驾驶 + 华为鸿蒙 OS 车机系统体验
  8. asp 更新 mysql数据库_ASP如何使用MYSQL数据库
  9. 程序员除了转行做管理,还可以做什么?
  10. 使用纯原生JS实现日历
  11. 线程创建方式3-实现 callable接口(Java)
  12. mysql——启动服务问题Found option without preceding group in config file
  13. Ubuntu 下安装 GCC 的方法
  14. 【智能制造】智能制造能力成熟度评测三部曲
  15. 程序员学习交流的网站论坛
  16. 数据分析报告4:睡眠情况分析
  17. 服务器1U,2U的含义
  18. 2016年华为优招面试经验
  19. CleanCode-函数
  20. 以“基”取胜:青立方超融合易捷版,助力企业“极简”上云

热门文章

  1. JDBC编程专题9之JDBC事务
  2. Java匿名内部类里为什么能用外部变量
  3. 【转】windows 7系统安装与配置Tomcat服务器环境
  4. Hibernate的多表查询,分装到一个新的实体类中的一个方法
  5. poj 2983 Is the Information Reliable?
  6. 第一个Ajax.net程序的实现及心得。
  7. 一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
  8. 为什么大学感觉学编程很难?原因有这三点。
  9. 一名老程序员的一点感悟给未来的程序员
  10. 开发和编程是一样的吗?区别有哪些?