【发布时间】:2016-10-31 12:29:01
【问题描述】:
这不是家庭作业,这纯粹是为了我自己的个人教育。
我不知道如何实现对齐的 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);
}
实现确实有效,但老实说我无法弄清楚它是如何工作的。
这是我无法理解的:
- 为什么我们需要偏移量?
- anding 与
~(alignment - 1)的作用是什么 -
p2是一个双指针。为什么我们可以从一个应该只返回一个指针的函数中返回它? - 解决此问题的一般方法是什么?
非常感谢任何帮助。
编辑
这不是How to allocate aligned memory only using the standard library? 的重复,因为我还需要知道如何释放对齐的内存。
【问题讨论】:
-
这仅在
aligned是 2 的幂并且假定您的对齐至少与void*所需的一样大时才有效。 -
另外:
size_t(在设置p2的行中)应该是uintptr_t。不能保证size_t足够大来表示指针值。 -
@Daniel Rudy Proposed duplicate 很好地回答了如何分配对齐的内存。它没有解决也没有回答如何像这段代码尝试那样释放内存。在提议的欺骗中,释放是用原始指针完成的,它的存储没有详细说明。在这里,代码尝试保存/恢复分配块中的原始指针。
-
@PaulHankin 在您的第一条评论中您说:
it assumes your alignment is at least as large as required for void*。我不确定我是否理解这个声明。你能详细说明一下吗?