欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 为什么要内存对齐?

为什么要内存对齐?

2025/2/21 2:14:47 来源:https://blog.csdn.net/weixin_73622063/article/details/145235098  浏览:    关键词:为什么要内存对齐?

内存对齐

初步认识

内存对齐是什么?从下面的代码可以比较直观地有一个简单的认识:

#include <iostream>using namespace std;struct s1 {int i;char c1;char c2;
};struct s2 {char c1;int i;char c2;
};struct s3 {char c1;char c2;int i;
};int main(int argc, const char* argv[]) {cout << sizeof(s1) << endl;cout << sizeof(s2) << endl;cout << sizeof(s3) << endl;
} 

上面的代码输出如下:

  • s1为8字节:
    • i:4字节
    • c1:1字节
    • c2:1字节+2填充字节
  • s2为12字节:
    • c1:1字节+3填充字节
    • i:4字节
    • c2:1字节+3填充字节
  • s3为8字节:
    • c1:1字节
    • c2:1字节+2填充字节
    • i:4字节

原因探究

简单来看,主要是以下两个原因:

  • 性能优化:大多数现代处理器都要求数据按照特定的边界对齐,因为寄存器只能从能整除以4的地址开始读取数据(一次读取4字节(32位)或8字节(64位)),为什么寄存器这样设计,也是为了能够并行处理,加快内存访问。
  • 硬件要求:某些处理器对于未对齐的/内存访问是禁止的,可能导致错误

我们主要研究第一个原因性能优化,就拿上面的代码中的结构体s2来说,如果内存没有对齐,假设内存是如下分布的:
在这里插入图片描述
如果要读取变量i,就需要进行两次读取操作,然后再获取到变量i的值
在这里插入图片描述

如果内存是对齐的,则内存如下分布:
在这里插入图片描述
如果要读取变量i,只需要进行一次读取操作:
在这里插入图片描述

所以可以看出,内存对齐是真的可以加快内存的访问,提高性能。

口头回答;为什么内存不对齐,就有可能导致额外的读取操作?(读取6字节数据和8字节数据,为什么读取8字节的性能就更高?)

因为寄存器只能从能整除以4的地址开始读取,也就是内存地址被一个一个的边界进行”分割“,且寄存器只能从这一个一个边界开始读取数据,内存不对齐有可能导致数据的存放刚好被边界分成两边,这样就得读取边界的左边和右边,才能把这个数据读取完整。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词