gpt4 book ai didi

c - 为什么这个 malloc 包装器对请求的内存大小执行此操作?尺寸 = (尺寸 + 3) & ~3;

转载 作者:太空狗 更新时间:2023-10-29 15:56:32 31 4
gpt4 key购买 nike

我正在查看 DOOM 源代码,我找到了 this行。

void *
Z_Malloc
(int size,
int tag,
void *user) {
int extra;
memblock_t *start;
memblock_t *rover;
memblock_t *newblock;
memblock_t *base;

size = (size + 3) & ~3; // Why is it doing this?
...

我看到 sizeof 用了很多来创建字节偏移量,但我从未见过这个。

我知道这个函数的调用者想要分配一些内存,但我不知道为什么它会像这样操纵 size

它在做什么?

最佳答案

size = (size+3) & ~3 将大小四舍五入到最接近的 4 的倍数。

这样做是为了让所有 block 的长度都是 4 字节的倍数,并且每个 block 的起始地址都是 4 的倍数。

这是必要的,这样 block 内的 int 和指针的位置可以对齐以适合单个内存字,这使得访问它们更有效。有些处理器实际上需要它。

要查看舍入的工作原理,假设 size = 4x-a,其中 0 <= a <= 3。我们有:

size+3 = 4x + (3-a),其中 3-a 也在 03< 之间/em>.

~3 是一个位掩码,包括除 2021 之外的所有位,所以 & 操作将只留下 4 的倍数:

(尺寸+3)&~3 = 4x

关于c - 为什么这个 malloc 包装器对请求的内存大小执行此操作?尺寸 = (尺寸 + 3) & ~3;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55433330/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com