#include <stdio.h>
#include <stdlib.h>
void* aligned_malloc(size_t size, size_t alignd_byte)
{
//offset地址偏移量(byte)
//alignd_byte对齐字节的预分配空间
//sizeof(void *)保存真实指针的预分配空间
size_t offset = sizeof(void *) + alignd_byte - 1;
//预分配更大的内存块
//q指向这块内存的首地址
void* q = malloc(size + offset);
if (!q)
return NULL;
//printf("q = 0x%p\n", q);
//对齐后的内存块
//不管怎样q指针都向后偏移,再& ~(alignd_byte - 1)地址对齐
//如果是任意字节对齐的话这个偏移计算方法要换
void* p = (void *)(((size_t)(q)+offset) & ~(alignd_byte - 1));
//为了配合free函数,保存q指针到p-1的位置
//p[-1] = q;直接这样做不行void *大小未知无法寻址
*(((void **)p) - 1) = q;
//返回对齐后的指针
return p;
}
void aligned_free(void* p)
{
//计算原内存块的首地址
void* q = ((void **)p)[-1];
free(q);
}
int main()
{
//对齐内存分配
int size = 1234; //需要分配的内存大小(byte)
int alignment = 128; //2^n byte地址对齐
void* p = NULL;
void* q = NULL;
int nCount = 0;//为了测试查找未alignment(byte)对齐的情况
while (1)
{
nCount++;
void* p = aligned_malloc(size, alignment); // 对齐后的
void* q = ((void **)p)[-1]; // 未处理过对齐的
if ((size_t)q % alignment != 0)
{
printf("p = %p, %d\n", p, (size_t)p % alignment);
printf("q = %p, %d\n", q, (size_t)q % alignment);
for (int i = 1; i <= size / sizeof(int); i++)
{
((int *)p)[i - 1] = i;
}
for (int i = 1; i <= size / sizeof(int); i++)
{
printf("%d ", ((int *)p)[i - 1]);
if (i % 10 == 0)
printf("\n");
}
printf("\n");
aligned_free(p);
break;
}
aligned_free(p);
}
printf("nCount = %d\n", nCount);
system("PAUSE");
return 0;
}
实现支持2^n字节对齐分配的malloc和free函数
最新推荐文章于 2024-01-29 16:40:40 发布