内存分配对齐

13 篇文章 0 订阅

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;

  

     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值