gpt4 book ai didi

c - 对齐 malloc 实现的解释

转载 作者:太空狗 更新时间:2023-10-29 16:44:24 25 4
gpt4 key购买 nike

这不是作业,这纯粹是为了我自己的个人教育。

我不知道如何实现对齐的 malloc,所以上网查找并找到 this website .为了便于阅读,我将在下面发布代码:

#include <stdlib.h>
#include <stdio.h>

void* aligned_malloc(size_t required_bytes, size_t alignment)
{
void* p1; // original block
void** p2; // aligned block
int offset = alignment - 1 + sizeof(void*);
if ((p1 = (void*)malloc(required_bytes + offset)) == NULL)
{
return NULL;
}
p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1));
p2[-1] = p1;
return p2;
}

void aligned_free(void *p)
{
free(((void**)p)[-1]);
}

void main (int argc, char *argv[])
{
char **endptr;
int *p = aligned_malloc (100, strtol(argv[1], endptr, 10));

printf ("%s: %p\n", argv[1], p);
aligned_free (p);
}

该实现确实有效,但老实说我无法弄清楚它是如何工作的。

这是我不明白的地方:

  1. 为什么我们需要补偿?
  2. ~(alignment - 1) 完成了什么
  3. p2 是一个双指针。为什么我们可以从一个应该只返回一个指针的函数中返回它?
  4. 解决这个问题的一般方法是什么?

非常感谢任何帮助。

编辑

这不是 How to allocate aligned memory only using the standard library? 的副本因为我还需要知道如何释放对齐的内存。

最佳答案

  1. 如果您想支持超出系统的 malloc() 功能的对齐方式,则需要一个偏移量。例如,如果您的系统 malloc() 对齐到 8 字节边界,而您想要对齐到 16 字节,您需要额外的 15 个字节,这样您就可以确定可以移动结果以对齐它按照要求。您还可以将 sizeof(void*) 添加到传递给 malloc() 的大小,以便为簿记留出空间。

  2. ~(alignment - 1) 是保证对齐的东西。例如,如果对齐方式为 16,则减去 1 得到 15,也就是 0xF,然后将其取反得到 0xFF..FF0,这是您需要满足来自 malloc() 的任何返回指针的对齐方式的掩码.请注意,此技巧假定对齐是 2 的幂(实际上通常是这样,但确实应该进行检查)。

  3. 这是一个void**。该函数返回 void*。这没问题,因为指向 void 的指针是“指向任何类型的指针”,在本例中该类型是 void*。换句话说,允许将 void* 与其他指针类型相互转换,并且双指针仍然是指针。

  4. 此处的总体方案是将原始指针存储在返回给调用者的指针之前。标准 malloc() 的一些实现做同样的事情:在返回的 block 之前存储簿记信息。这使得在调用 free() 时很容易知道要回收多少空间。

总而言之,这种事情通常没有用,因为标准的 malloc() 返回系统上的最大对齐。如果您还需要对齐,可能还有其他解决方案,包括特定于编译器的属性。

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

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