为什么要内存对齐

数据类型的对齐:C++编译器会自动确保大多数数据类型按照其对齐要求在内存中布局。这意味着如果你定义一个int,它将在内存中以4字节对齐。 而double通常要求8字节对齐。

结构体和类的对齐:结构体和类的对齐要求是其成员中的最大对齐要求。因此,如果结构体或类包含一个double和一个int,它的对齐要求将是8字节。

结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则:

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

  2. 结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节{trailing padding}。

C++中的内存对齐_c++内存对齐_给我来一杯冰可乐的博客-优快云博客


之前学习内存对齐的时候,只死记硬背了个“4字节”,记住了几个题型。

最近看《代码随想录》的时候上面说了一下内存对齐的主要原因:

  1. 不是所有的硬件平台都能任意访问内存地址上的数据,某些平台只能在一些地址处获取特定类型的数据,否则抛出硬件异常。为了使同一程序可以在多平台运行,需要进行内存对齐;
  2. 经过内存对齐后,CPU访问内存的速度会大大提升。

一些硬件平台将内存划分为4字节的块,只能按照0,4,8,12,16…,这样去寻址,不能直接去访问中间的1,2,3,5,6,7…,这些不能被4整除的地址。

这样的话,如果我们将一个int型的变量存储在非4倍数开始的起始块中,要想获取这个变量,要访问两次内存,还要进行拼接。而采用内存对齐的话,只需要访问一次内存。

struct node2{
    char c;
    int num;
};

非对齐。若要取出num,需要先进行一次内存访问,取出num的前三个字节,再次进行内存访问,取出num的最后一个字节。再将两者进行拼接,从而获取num。
在这里插入图片描述

对齐。直接进行一次内存访问,便可取出num。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值