数据类型的对齐:C++编译器会自动确保大多数数据类型按照其对齐要求在内存中布局。这意味着如果你定义一个int,它将在内存中以4字节对齐。 而double通常要求8字节对齐。
结构体和类的对齐:结构体和类的对齐要求是其成员中的最大对齐要求。因此,如果结构体或类包含一个double和一个int,它的对齐要求将是8字节。
结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则:
-
结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
-
结构体每个成员相对结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
-
结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节{trailing padding}。
C++中的内存对齐_c++内存对齐_给我来一杯冰可乐的博客-优快云博客
之前学习内存对齐的时候,只死记硬背了个“4字节”,记住了几个题型。
最近看《代码随想录》的时候上面说了一下内存对齐的主要原因:
- 不是所有的硬件平台都能任意访问内存地址上的数据,某些平台只能在一些地址处获取特定类型的数据,否则抛出硬件异常。为了使同一程序可以在多平台运行,需要进行内存对齐;
- 经过内存对齐后,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。