1. 调用palloc()函数,实现动态分配地址对齐的内存(但是很多系统中默认是不提供这个接口的,不过大多数底层硬件商都在里面做了这个接口)
2. 动态分配对齐的内存:自己在malloc()函数的基础上进行封装(推荐使用这种方式)
方案一: 简单地对如下代码进行封装,自己建立一个buffer池进行管理
eg:
申请大小为 size, 对齐方式为 aligned 字节,( aligned < size )
void* ptr = malloc(size + aligned);
void* ptr_aligned =(void*)( ptr + aligned -1 ) & (~(aligned)) ;
使用ptr_aligned 指针进行操作
释放该内存时, 在链表(或者其他能够查表的数据结构)中查询 ptr_aligned 对应的 ptr ,然后
free(ptr);
ptr = NULL;
ptr_aligned = NULL;
很简单吧~
方案二: 扩大分配size 将指针 存放在所开辟内存的内部
eg:
申请大小为 size, 对齐方式为 aligned 字节,( aligned < size )
void* ptr = malloc(size + sizeof(void *) + aligned);
void* ptr_aligned = (void*)( ptr + sizeof(void*) + aligned -1) & (~ (aligned));
void** pptr_temp = (void **) ptr_aligned;
pptr_temp[-1] = ptr;
return prt_aligned;
释放内存时:
void **pptr_temp = (void **) ptr_aligned;
void *ptr = pptr_temp[-1];
free(ptr);
3. 使用编译器指令 __attribute__((align(n)))对结构体的声明进行对齐
1> 申明一个 结构体A , 按照 n 字节对齐
struct A
{
.....
}__attribute__((align(n)));
2> 申明一个数组 B ,按照 n 字节对齐
int __attribute__((align(n))) B;