gpt4 book ai didi

c++ - 对齐的 malloc C++ 实现

转载 作者:行者123 更新时间:2023-11-28 01:29:59 26 4
gpt4 key购买 nike

我找到了这段代码:

void* aligned_malloc(size_t required_bytes, size_t alignment) {
int offset = alignment - 1;
void* P = (void * ) malloc(required_bytes + offset);
void* q = (void * ) (((size_t)(p) + offset) & ~(alignment - 1));
return q;
}

也就是aligned malloc在C++中的实现。对齐的 malloc 是一个支持分配内存的函数,这样返回的内存地址可被 2 的特定幂整除。示例:

align_malloc (1000, 128) 将返回一个内存地址,它是 128 的倍数并且指向大小为 1000 字节的内存。

但我不明白第 4 行。为什么要加两倍的偏移量?

谢谢

最佳答案

Why sum twice the offset?

offset 并没有被精确地计算两次。首先使用 offset 是为了分配大小:

void* p = (void * ) malloc(required_bytes + offset);

第二次是对齐:

void* q = (void * ) (((size_t)(p) + offset) & ~(alignment - 1));

解释:~(alignment - 1)offset否定(记住,int offset = alignment - 1;)这给你面具你需要满足对齐要求。在算术方面,添加偏移量并执行按位与 (&) 及其取反得到对齐指针的地址。

这个算法是如何工作的?首先,请记住对 malloc() 的内部调用是针对 required_bytes + offset 字节的。就像,不是你要求的对齐方式。例如,您想要分配 10 个字节,对齐方式为 16(因此所需的行为是分配从可被 16 整除的地址开始的 10 个字节)。所以上面的这个 malloc() 会给你 10+16-1=25 字节。就被 16) 整除而言,不一定要从正确的地址开始。但是这个 16-10x000F 并且它的否定 (~) 是 0xFFF0。现在我们像这样应用按位与:p + 15 & 0xFFF0 这将使每个指针p 成为16 的倍数。

但是等等,为什么要首先添加这个 alignment - 1 的偏移量? 你这样做是因为一旦你获得了指针 pmalloc() 返回,你不能做的一件事 -- 为了找到最近的地址,它是请求的对齐的倍数 -- 是寻找它before p,因为这可能会进入在 p 之前分配的地址空间。为此,您首先要添加 alignment - 1,仔细想想,这正是您必须前进的最大值让你对齐。

* 感谢用户 DevSolar 提供一些额外的措辞。

注意 1:要使这种方式起作用,对齐方式必须是 2 的幂。此代码段不会强制执行此类操作,因此可能会导致意外行为。

注意 2:一个有趣的问题是如何使用此函数的返回值为此类分配实现 free() 版本。

关于c++ - 对齐的 malloc C++ 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936866/

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