我正在aligned_malloc
用C ++编程实现,主要使用以下代码,这些代码可以在Interweb的不同位置找到,包括SO:
void * aligned_malloc(size_t size, int align) {
if (align < 0) {
return NULL;
}
void *ptr;
void *p = malloc(size + align - 1 + sizeof(void*));
if (p != NULL) {
ptr = (void*) (((ptrdiff_t)p + sizeof(void*) + align -1) & ~(align-1));
*((void**)((ptrdiff_t)ptr - sizeof(void*))) = p;
return ptr;
}
return NULL;
}
void aligned_free(void *p) {
void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));
free(ptr);
return;
}
我进入*(void**)
了aligned_malloc
。我的误会是演员的失误aligned_free
。由于我们只需要该值,而不必分配给它,为什么不使用
void *ptr = ((void*)((ptrdiff_t)p - sizeof(void*)));
代替
void *ptr = *((void**)((ptrdiff_t)p - sizeof(void*)));
我以为是一样的,但是当我尝试第一个对齐方式为64时,它给了我一个错误,但是当我尝试第二次强制转换时,程序正常运行了。那么两者之间有什么区别?为了便于阅读,我省略了适当的C ++强制转换。
让我们简化代码:
int x = 7;
void * p = &x;
void * q = &p;
现在让我们画一个图:
+---+
x | 7 |
+---+
^
|
+-|-+
p | * |
+---+
^
|
+-|-+
q | * |
+---+
你看到如何p
和q
不平等吗?如果您有q
并且想要进入p
,则必须取消引用q
。但是由于void*
不能取消引用a,因此您必须向类型系统保证,它将在取消引用之后找到另一个指针,从而将其强制转换void**
为取消引用之前的指针。
assert(q != p);
assert(*(void**)q == p);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句