为什么需要内存对齐
创始人
2024-05-24 23:55:07
0

内存对齐

为什么需要内存对齐?

平台原因:不是所有的硬件平台都能访问任意内存地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了同一个程序可以在多平台运行,需要内存对齐。

性能原因:内存对齐能够提高内存访问效率。CPU 在读取内存时,一次读取固定长度的数据(如4字节、8字节等)。如果将多个变量连续分配在内存中而不做对齐处理,会造成 CPU 读取数据出现“半包”的情况,此时,需要再进行一次内存访问才能获取该变量数据。

示例

在 32 位编译器(4字节对齐)中,以下结构的内存是如何分配的?

struct {char a;int b;
}st;

内存对齐的情况下,结构体 st 总共占 8 字节,其中 a 与 b 之间空余的 3 字节用于补齐缺少的字节(如果是 8 字节对齐,则需要补齐 8 字节)。

而在非内存对齐的情况下,仅占据 5 字节。

其在内存中的分布如下图所示:

请添加图片描述

可以发现,内存对齐会浪费一部分空间。事实也是如此,通常情况下,相对于空间,运行速度的提升更为重要。

在内存对齐的情况下,CPU 读取 int 类型的 b,仅需一次内存寻址即可完成。而对于非内存对齐,第一次寻址只能获得 b 的前 3 个字节数据,要获取完整的数据还需要再进行一次内存寻址,以获得第 4 个字节的数据。

这也是内存对齐能够提高效率的原因。

请添加图片描述

Reference

  1. https://blog.csdn.net/qq_43516928/article/details/119680760
  2. https://zhuanlan.zhihu.com/p/83449008

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...