C语言内存对齐代码不太理解

CPU位于IA32-E模式(64位模式,2MB分页)
以下代码将内存管理结构的结束地址对齐并赋值给memory_management_struct.end_of_struct ,memory_management_struct.zones_struct是一个管理结构的起始地址,memory_management_struct.zones_length是结构总长(long的倍数),想知道如下代码如何做到内存对齐?如何推导?
我不太明白为什么要乘以32而不是64,按照我的理解应该是64因为一个long占8个字节也就是64个比特;
之前问了几个关于内存对齐的代码,现在仍然感觉看得不是特别明白,想知道如何看懂这类代码?

    memory_management_struct.end_of_struct = (unsigned long)((unsigned long)memory_management_struct.zones_struct + memory_management_struct.zones_length + sizeof(long) * 32) & ( ~ (sizeof(long) - 1));    ////need a blank to separate memory_management_struct
& ( ~ (sizeof(long) - 1)); & ~7
这一段是用来对齐到8字节(64bit)的
如需要23字节,对齐后就变成16字节, 23 & ~7 = 16
+ sizeof(long) * 32
即 + 256
这一段不是用来对齐的,是预览内存空间
用途1:对齐后可能数值变小了,需要加回去(如23对齐后变成了16,至少要加8)
用途2:可能其他代码用到了这么大的内存(*32还是*多少,这个跟对齐没有关系,是看其他用到的地方需要多大)

内存对齐是指将内存的访问边界对齐到硬件定义的块大小的边界,以减少访问内存的次数并加快内存访问速度。

memory_management_struct.end_of_struct = (unsigned long) memory_management_struct.zones_struct +
                                         ((memory_management_struct.zones_length * 32 + 31) & ~31);

内存对齐操作如下:

将zones_length乘以32。
将结果加上31,以保证足够大以便做逻辑与操作(& ~31)。
将结果与 ~31做逻辑与操作,将结果变为32字节对齐的值。

为什么乘以32而不是64,可能是为了对齐到32字节的边界,因为这比对齐到64字节的边界更容易处理。

32还是64,要看这段代码编写时,计算机是多少位的
memory_management_struct.zones_length是结构总长(long的倍数) --- 是字节数吗?假设结构体共有5个long,那么这个length值是5,20,还是160?

这段代码将内存管理结构的结束地址对齐到一个long的倍数。

首先,将内存管理结构的开始地址加上结构总长,再加上32个long的大小,得到可能不对齐的地址。

然后使用 & 运算符与一个 ~(sizeof(long) - 1) 的值相与,从而将地址对齐到long的倍数。

其中, ~(sizeof(long) - 1) 的值实际上是long的最高位全部取反,保证了它是long的倍数,从而能够将地址对齐到long的倍数。

因此,之所以乘以32,是因为想要将内存管理结构的结束地址向后延长32个long的大小,以便使其对齐到long的倍数。

对于理解这类代码,了解位运算(特别是 & 和 ~)以及内存对齐的概念是很重要的。

这段代码实现了对齐内存结束地址的操作。它通过将内存块长度加上32个long类型的长度,再将得到的结果与一个 long 类型长度取反的结果进行 & 运算,得到了对齐的内存地址。

为什么乘以32而不是64,这是因为内存对齐并不一定是以字节为单位的,有的系统以long为单位对齐,有的则以字节为单位对齐。因此,这段代码是以long为单位对齐的。

想更好的理解这段代码,可以了解内存对齐的原理以及如何进行内存对齐。